)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6cc425f2d12d60837574f38dd03082a095156b98","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The root disk image is moved to a separate disk slot while the"},{"line_number":10,"context_line":"rescue image will take it\u0027s place. If the instance requires it,"},{"line_number":11,"context_line":"a temporary config drive is created as well."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Unrescuing the instance will move the root disk image back in"},{"line_number":14,"context_line":"place, removing temporary images."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"9a8ffd7b_c00747c8","line":11,"updated":"2015-12-03 11:31:45.000000000","message":"While re-arranging existing disks for purpose of rescue mode is what libvirt currently does, we consider it a pretty bad idea. For that reason we have a new approach being targetted for Mitaka\n\nhttp://specs.openstack.org/openstack/nova-specs/specs/mitaka/approved/virt-rescue-stable-disk-devices.html\n\nThe essential idea is that we leave existing disk setup alone. We instead attach the rescue image as a cdrom or usb disk and configure the BIOS boot order to use that new disk. The choice of cdrom vs usb vs something else is tunable based on image properties.\n\nIt is intended that all virt drivers adopt this saner approach. Since rescue is a new feature for hyper-v, I think it is wise to implement the new approach straight away, and thus avoid the need to maintain compat for the old approach. This would probably make your code simper as you wouldn\u0027t need to care about messing with existing disk config.","commit_id":"34d40f98b55dddffa11fec2dad9acaf0d6f507f7"}],"nova/tests/unit/virt/hyperv/test_imagecache.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff5d55034f4d229d3e36d719449b8c88b3bcc7e3","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        mock_resize.assert_called_once_with(self.instance, expected_vhd_path)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    @mock.patch.object(imagecache.images, \u0027fetch\u0027)"},{"line_number":148,"context_line":"    def test_cache_rescue_image_bigger_than_flavor(self, mock_fetch):"},{"line_number":149,"context_line":"        fake_rescue_image_id \u003d \u0027fake_rescue_image_id\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        self.imagecache._vhdutils.get_vhd_info.return_value \u003d {"}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_dce2892f","line":148,"updated":"2015-07-14 09:50:33.000000000","message":"What makes this rescue specific?","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"51eae342269f5070132fd237de9723dec8f55139","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        mock_resize.assert_called_once_with(self.instance, expected_vhd_path)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    @mock.patch.object(imagecache.images, \u0027fetch\u0027)"},{"line_number":148,"context_line":"    def test_cache_rescue_image_bigger_than_flavor(self, mock_fetch):"},{"line_number":149,"context_line":"        fake_rescue_image_id \u003d \u0027fake_rescue_image_id\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        self.imagecache._vhdutils.get_vhd_info.return_value \u003d {"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a41bdd9_597155df","line":148,"in_reply_to":"ba3cc151_dce2892f","updated":"2015-07-14 10:14:51.000000000","message":"In case of a regular boot image, the virtual disk size would be validated when performing the resize according to the flavor size, which would not happen in case of a rescue image.","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"}],"nova/tests/unit/virt/hyperv/test_pathutils.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"21dac98862808a48b0b6b4fa4cb2012ea9c57d69","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        for format_ext in constants.DISK_FORMAT_MAP:"},{"line_number":53,"context_line":"            configdrive_path \u003d self._mock_lookup_configdrive_path(format_ext,"},{"line_number":54,"context_line":"                                                                  rescue)"},{"line_number":55,"context_line":"            fake_path \u003d os.path.join(self.fake_instance_dir,"},{"line_number":56,"context_line":"                                     configdrive_name + \u0027.\u0027 + format_ext)"},{"line_number":57,"context_line":"            self.assertEqual(configdrive_path, fake_path)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"1aca2d91_9955121f","line":55,"updated":"2015-05-13 23:04:00.000000000","message":"could this be renamed to expected_path?","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f43b0f527f5ca86c76e6c7def0cb860795177966","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        for format_ext in constants.DISK_FORMAT_MAP:"},{"line_number":53,"context_line":"            configdrive_path \u003d self._mock_lookup_configdrive_path(format_ext,"},{"line_number":54,"context_line":"                                                                  rescue)"},{"line_number":55,"context_line":"            fake_path \u003d os.path.join(self.fake_instance_dir,"},{"line_number":56,"context_line":"                                     configdrive_name + \u0027.\u0027 + format_ext)"},{"line_number":57,"context_line":"            self.assertEqual(configdrive_path, fake_path)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_3a74db9a","line":55,"in_reply_to":"1aca2d91_9955121f","updated":"2015-05-14 12:31:06.000000000","message":"Sure.","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"21dac98862808a48b0b6b4fa4cb2012ea9c57d69","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                                                                  rescue)"},{"line_number":55,"context_line":"            fake_path \u003d os.path.join(self.fake_instance_dir,"},{"line_number":56,"context_line":"                                     configdrive_name + \u0027.\u0027 + format_ext)"},{"line_number":57,"context_line":"            self.assertEqual(configdrive_path, fake_path)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test_lookup_configdrive_path(self):"},{"line_number":60,"context_line":"        self._test_lookup_configdrive_path()"}],"source_content_type":"text/x-python","patch_set":24,"id":"1aca2d91_1940e255","line":57,"updated":"2015-05-13 23:04:00.000000000","message":"and then have here: self.assertEqual(expected_path, configdrive_path)?","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f43b0f527f5ca86c76e6c7def0cb860795177966","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                                                                  rescue)"},{"line_number":55,"context_line":"            fake_path \u003d os.path.join(self.fake_instance_dir,"},{"line_number":56,"context_line":"                                     configdrive_name + \u0027.\u0027 + format_ext)"},{"line_number":57,"context_line":"            self.assertEqual(configdrive_path, fake_path)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test_lookup_configdrive_path(self):"},{"line_number":60,"context_line":"        self._test_lookup_configdrive_path()"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_9a650fe3","line":57,"in_reply_to":"1aca2d91_1940e255","updated":"2015-05-14 12:31:06.000000000","message":"Done","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"}],"nova/tests/unit/virt/hyperv/test_vmops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"fe9e0beaa52c4b6359c3e1cb4ceb7b1fd5777373","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        fake_base_image_path \u003d r\u0027c:\\Instances\\_base\\fake_base_image_path.vhd\u0027"},{"line_number":255,"context_line":"        fake_root_vhd_path \u003d os.path.join(r\u0027fake_instance_dir\\root.vhd\u0027)"},{"line_number":256,"context_line":"        fake_rescue_image_path \u003d os.path.join(fake_rescue_instance_dir,"},{"line_number":257,"context_line":"                                              \u0027rescue.vhd\u0027)"},{"line_number":258,"context_line":"        fake_pathutils \u003d self._vmops._pathutils"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_8d6f742a","line":257,"updated":"2014-11-25 12:48:15.000000000","message":"constants?","commit_id":"4b35de615cbf55caf99de77117cac1ac10499d71"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"6c4a43bfe19c25ec25e77459a256227629cd6bfa","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        fake_base_image_path \u003d r\u0027c:\\Instances\\_base\\fake_base_image_path.vhd\u0027"},{"line_number":255,"context_line":"        fake_root_vhd_path \u003d os.path.join(r\u0027fake_instance_dir\\root.vhd\u0027)"},{"line_number":256,"context_line":"        fake_rescue_image_path \u003d os.path.join(fake_rescue_instance_dir,"},{"line_number":257,"context_line":"                                              \u0027rescue.vhd\u0027)"},{"line_number":258,"context_line":"        fake_pathutils \u003d self._vmops._pathutils"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_3c71e6e0","line":257,"in_reply_to":"5a890539_430e3de6","updated":"2014-11-28 17:04:27.000000000","message":"Done","commit_id":"4b35de615cbf55caf99de77117cac1ac10499d71"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"463b27788846b2795e24164af5e998ddd85ac5a8","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        fake_base_image_path \u003d r\u0027c:\\Instances\\_base\\fake_base_image_path.vhd\u0027"},{"line_number":255,"context_line":"        fake_root_vhd_path \u003d os.path.join(r\u0027fake_instance_dir\\root.vhd\u0027)"},{"line_number":256,"context_line":"        fake_rescue_image_path \u003d os.path.join(fake_rescue_instance_dir,"},{"line_number":257,"context_line":"                                              \u0027rescue.vhd\u0027)"},{"line_number":258,"context_line":"        fake_pathutils \u003d self._vmops._pathutils"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_430e3de6","line":257,"in_reply_to":"5a890539_8d6f742a","updated":"2014-11-25 13:37:26.000000000","message":"Well, I don\u0027t think that defining constants for all the one-time-used variables used in unit tests is of any use. But this is just my opinion.","commit_id":"4b35de615cbf55caf99de77117cac1ac10499d71"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"8620865a307cdeb011c1de9a35600cfcb6ed3996","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_create_root_vhdx_size_less_than_internal(self):"},{"line_number":174,"context_line":"        self._test_create_root_vhd_exception("},{"line_number":175,"context_line":"            vhd_format\u003dconstants.DISK_FORMAT_VHD)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_is_resize_needed_exception(self):"},{"line_number":178,"context_line":"        inst \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_c16286d7","line":175,"updated":"2015-02-10 09:40:09.000000000","message":"Shouldn\u0027t there also be a test for creating root vhd with is_rescue_vhd set to True?","commit_id":"1ba21912f4d62e7cc15e1cb2de6b6bb8f5e71209"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"04e0b2c0e580d27020e9acd114fc0fe4f426584d","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_create_root_vhdx_size_less_than_internal(self):"},{"line_number":174,"context_line":"        self._test_create_root_vhd_exception("},{"line_number":175,"context_line":"            vhd_format\u003dconstants.DISK_FORMAT_VHD)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_is_resize_needed_exception(self):"},{"line_number":178,"context_line":"        inst \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_9caab5d0","line":175,"in_reply_to":"da86d52c_c16286d7","updated":"2015-02-10 10:28:27.000000000","message":"Done","commit_id":"1ba21912f4d62e7cc15e1cb2de6b6bb8f5e71209"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"8620865a307cdeb011c1de9a35600cfcb6ed3996","unresolved":false,"context_lines":[{"line_number":454,"context_line":"    @mock.patch(\u0027nova.api.metadata.base.InstanceMetadata\u0027)"},{"line_number":455,"context_line":"    @mock.patch(\u0027nova.virt.configdrive.ConfigDriveBuilder\u0027)"},{"line_number":456,"context_line":"    @mock.patch(\u0027nova.utils.execute\u0027)"},{"line_number":457,"context_line":"    def _test_create_config_drive(self, mock_execute, mock_ConfigDriveBuilder,"},{"line_number":458,"context_line":"                                  mock_InstanceMetadata, config_drive_format,"},{"line_number":459,"context_line":"                                  config_drive_cdrom, side_effect):"},{"line_number":460,"context_line":"        mock_instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_2130c29d","line":457,"updated":"2015-02-10 09:40:09.000000000","message":"Here as well, shouldn\u0027t there be a test for creating config drive with rescue\u003dTrue?","commit_id":"1ba21912f4d62e7cc15e1cb2de6b6bb8f5e71209"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"04e0b2c0e580d27020e9acd114fc0fe4f426584d","unresolved":false,"context_lines":[{"line_number":454,"context_line":"    @mock.patch(\u0027nova.api.metadata.base.InstanceMetadata\u0027)"},{"line_number":455,"context_line":"    @mock.patch(\u0027nova.virt.configdrive.ConfigDriveBuilder\u0027)"},{"line_number":456,"context_line":"    @mock.patch(\u0027nova.utils.execute\u0027)"},{"line_number":457,"context_line":"    def _test_create_config_drive(self, mock_execute, mock_ConfigDriveBuilder,"},{"line_number":458,"context_line":"                                  mock_InstanceMetadata, config_drive_format,"},{"line_number":459,"context_line":"                                  config_drive_cdrom, side_effect):"},{"line_number":460,"context_line":"        mock_instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_07bbcee5","line":457,"in_reply_to":"da86d52c_2130c29d","updated":"2015-02-10 10:28:27.000000000","message":"Done","commit_id":"1ba21912f4d62e7cc15e1cb2de6b6bb8f5e71209"}],"nova/tests/unit/virt/hyperv/test_vmutilsv2.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"21dac98862808a48b0b6b4fa4cb2012ea9c57d69","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        self.assertEqual(mock.sentinel.FAKE_DVD_PATH1, ret_val[0])"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch.object(vmutilsv2.VMUtilsV2, \u0027_get_vm_setting_data\u0027)"},{"line_number":263,"context_line":"    def test_get_vm_gen(self, mock_get_vm_setting_data):"},{"line_number":264,"context_line":"        mock_vm \u003d self._lookup_vm()"},{"line_number":265,"context_line":"        mock_vm_settings \u003d mock.Mock("},{"line_number":266,"context_line":"            VirtualSystemSubType\u003dself._vmutils._VIRTUAL_SYSTEM_SUBTYPE_GEN2)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_46ac72ed","line":263,"updated":"2015-05-13 23:04:00.000000000","message":"please also include a unit test for Hyper-V 2012, meaning a test in which mock_vm_settings does not have the attribute VirtualSystemSubType.","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f43b0f527f5ca86c76e6c7def0cb860795177966","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        self.assertEqual(mock.sentinel.FAKE_DVD_PATH1, ret_val[0])"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch.object(vmutilsv2.VMUtilsV2, \u0027_get_vm_setting_data\u0027)"},{"line_number":263,"context_line":"    def test_get_vm_gen(self, mock_get_vm_setting_data):"},{"line_number":264,"context_line":"        mock_vm \u003d self._lookup_vm()"},{"line_number":265,"context_line":"        mock_vm_settings \u003d mock.Mock("},{"line_number":266,"context_line":"            VirtualSystemSubType\u003dself._vmutils._VIRTUAL_SYSTEM_SUBTYPE_GEN2)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_3a05fbc1","line":263,"in_reply_to":"7a016987_46ac72ed","updated":"2015-05-14 12:31:06.000000000","message":"Done","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f43b0f527f5ca86c76e6c7def0cb860795177966","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        self.assertEqual(mock.sentinel.FAKE_DVD_PATH1, ret_val[0])"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch.object(vmutilsv2.VMUtilsV2, \u0027_get_vm_setting_data\u0027)"},{"line_number":263,"context_line":"    def test_get_vm_gen(self, mock_get_vm_setting_data):"},{"line_number":264,"context_line":"        mock_vm \u003d self._lookup_vm()"},{"line_number":265,"context_line":"        mock_vm_settings \u003d mock.Mock("},{"line_number":266,"context_line":"            VirtualSystemSubType\u003dself._vmutils._VIRTUAL_SYSTEM_SUBTYPE_GEN2)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_c8f73df4","line":263,"in_reply_to":"7a016987_46ac72ed","updated":"2015-05-14 12:31:06.000000000","message":"Done","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"}],"nova/virt/hyperv/driver.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"832dd401201a493e8c75a8d95a0987eb58386298","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                        image_meta, rescue_password)"},{"line_number":251,"context_line":"        except Exception:"},{"line_number":252,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":253,"context_line":"                self._vmops.unrescue_instance(instance)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def unrescue(self, instance, network_info):"},{"line_number":256,"context_line":"        self._vmops.unrescue_instance(instance, network_info)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a016987_ff9b9864","line":253,"updated":"2015-05-27 15:50:30.000000000","message":"Hm, this looks a bit... inconsistent with the rest of this class, as every other method will just delegate the call to an Ops instance. This is a bit nitpicky (and optional), but the try-except block would look better in vmops,\n\nBut, unit tests for this would be nice.","commit_id":"7b897c36d19e144f5966d1c10779be3c92bf4746"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"cccd799d4ba2e4fd3a247116e21aaa2cbfde97cf","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                        image_meta, rescue_password)"},{"line_number":251,"context_line":"        except Exception:"},{"line_number":252,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":253,"context_line":"                self._vmops.unrescue_instance(instance)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def unrescue(self, instance, network_info):"},{"line_number":256,"context_line":"        self._vmops.unrescue_instance(instance, network_info)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a016987_bf43dd6b","line":253,"in_reply_to":"7a016987_ff9b9864","updated":"2015-05-27 16:04:36.000000000","message":"Done","commit_id":"7b897c36d19e144f5966d1c10779be3c92bf4746"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"6033b66d2572567c56088901d6d9151e395e820b","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    def rescue(self, context, instance, network_info, image_meta,"},{"line_number":252,"context_line":"               rescue_password):"},{"line_number":253,"context_line":"        self._vmops.rescue_instance(context, instance, network_info,"},{"line_number":254,"context_line":"                                        image_meta, rescue_password)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    def unrescue(self, instance, network_info):"},{"line_number":257,"context_line":"        self._vmops.unrescue_instance(instance)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_f29f66b2","line":254,"updated":"2015-06-21 10:16:40.000000000","message":"the indentation here is dodgy","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d7d796ac58372f543020abff17d97d7da8c3e774","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    def rescue(self, context, instance, network_info, image_meta,"},{"line_number":252,"context_line":"               rescue_password):"},{"line_number":253,"context_line":"        self._vmops.rescue_instance(context, instance, network_info,"},{"line_number":254,"context_line":"                                        image_meta, rescue_password)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    def unrescue(self, instance, network_info):"},{"line_number":257,"context_line":"        self._vmops.unrescue_instance(instance)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_d236e2b3","line":254,"in_reply_to":"fa32b979_f29f66b2","updated":"2015-06-21 10:30:45.000000000","message":"Done","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"}],"nova/virt/hyperv/imagecache.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"21dac98862808a48b0b6b4fa4cb2012ea9c57d69","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # Note: rescue images are not resized."},{"line_number":130,"context_line":"        is_vhd \u003d vhd_path.split(\u0027.\u0027)[-1].lower() \u003d\u003d \u0027vhd\u0027"},{"line_number":131,"context_line":"        if (CONF.use_cow_images and is_vhd and not rescue_image_id):"},{"line_number":132,"context_line":"            # Resize the base VHD image as it\u0027s not possible to resize a"},{"line_number":133,"context_line":"            # differencing VHD. This does not apply to VHDX images."},{"line_number":134,"context_line":"            resized_vhd_path \u003d self._resize_and_cache_vhd(instance, vhd_path)"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a0c5dc1_d1d1d858","line":131,"updated":"2015-05-13 23:04:00.000000000","message":"the paranthesis aren\u0027t necessary here.","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f43b0f527f5ca86c76e6c7def0cb860795177966","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # Note: rescue images are not resized."},{"line_number":130,"context_line":"        is_vhd \u003d vhd_path.split(\u0027.\u0027)[-1].lower() \u003d\u003d \u0027vhd\u0027"},{"line_number":131,"context_line":"        if (CONF.use_cow_images and is_vhd and not rescue_image_id):"},{"line_number":132,"context_line":"            # Resize the base VHD image as it\u0027s not possible to resize a"},{"line_number":133,"context_line":"            # differencing VHD. This does not apply to VHDX images."},{"line_number":134,"context_line":"            resized_vhd_path \u003d self._resize_and_cache_vhd(instance, vhd_path)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_baf9ebca","line":131,"in_reply_to":"9a0c5dc1_d1d1d858","updated":"2015-05-14 12:31:06.000000000","message":"Done","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff5d55034f4d229d3e36d719449b8c88b3bcc7e3","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            return resized_vhd_path"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def get_cached_image(self, context, instance, rescue_image_id\u003dNone):"},{"line_number":97,"context_line":"        image_id \u003d rescue_image_id or instance.image_ref"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        base_vhd_dir \u003d self._pathutils.get_base_vhd_dir()"},{"line_number":100,"context_line":"        base_vhd_path \u003d os.path.join(base_vhd_dir, image_id)"}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_fccc2d8c","line":97,"updated":"2015-07-14 09:50:33.000000000","message":"Why does rescue affect cached images?","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"51eae342269f5070132fd237de9723dec8f55139","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            return resized_vhd_path"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def get_cached_image(self, context, instance, rescue_image_id\u003dNone):"},{"line_number":97,"context_line":"        image_id \u003d rescue_image_id or instance.image_ref"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        base_vhd_dir \u003d self._pathutils.get_base_vhd_dir()"},{"line_number":100,"context_line":"        base_vhd_path \u003d os.path.join(base_vhd_dir, image_id)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a41bdd9_79c8d922","line":97,"in_reply_to":"ba3cc151_fccc2d8c","updated":"2015-07-14 10:14:51.000000000","message":"The rescue API allows specifying a rescue image. This would retrieve and cache the rescue image if specified, using the instance base image otherwise.","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff5d55034f4d229d3e36d719449b8c88b3bcc7e3","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        return vhd_path"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _verify_rescue_image(self, instance, rescue_image_id,"},{"line_number":145,"context_line":"                             rescue_image_path):"},{"line_number":146,"context_line":"        rescue_image_info \u003d self._vhdutils.get_vhd_info(rescue_image_path)"},{"line_number":147,"context_line":"        rescue_image_size \u003d rescue_image_info[\u0027MaxInternalSize\u0027]"}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_1c91d152","line":144,"updated":"2015-07-14 09:50:33.000000000","message":"Why is this only for rescue? I am really getting confused here.","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"51eae342269f5070132fd237de9723dec8f55139","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        return vhd_path"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _verify_rescue_image(self, instance, rescue_image_id,"},{"line_number":145,"context_line":"                             rescue_image_path):"},{"line_number":146,"context_line":"        rescue_image_info \u003d self._vhdutils.get_vhd_info(rescue_image_path)"},{"line_number":147,"context_line":"        rescue_image_size \u003d rescue_image_info[\u0027MaxInternalSize\u0027]"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a41bdd9_59b4f5cf","line":144,"in_reply_to":"ba3cc151_1c91d152","updated":"2015-07-14 10:14:51.000000000","message":"The rescue image is not resized, so we must make sure it\u0027s not bigger than the flavor size at this step.\n\nIn case of a regular root image, it is resized based on the flavor size. If the image virtual size is bigger than the flavor size, the resize operation will fail stating that it cannot shrink the image.","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"}],"nova/virt/hyperv/pathutils.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff5d55034f4d229d3e36d719449b8c88b3bcc7e3","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def get_root_vhd_path(self, instance_name, format_ext, rescue\u003dFalse):"},{"line_number":190,"context_line":"        instance_path \u003d self.get_instance_dir(instance_name)"},{"line_number":191,"context_line":"        image_name \u003d \u0027rescue\u0027 if rescue else \u0027root\u0027"},{"line_number":192,"context_line":"        return os.path.join(instance_path,"},{"line_number":193,"context_line":"                            image_name + \u0027.\u0027 + format_ext.lower())"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_3c337564","line":191,"updated":"2015-07-14 09:50:33.000000000","message":"Nit: would root-rescue not be more consistent with the config drive one?","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"51eae342269f5070132fd237de9723dec8f55139","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def get_root_vhd_path(self, instance_name, format_ext, rescue\u003dFalse):"},{"line_number":190,"context_line":"        instance_path \u003d self.get_instance_dir(instance_name)"},{"line_number":191,"context_line":"        image_name \u003d \u0027rescue\u0027 if rescue else \u0027root\u0027"},{"line_number":192,"context_line":"        return os.path.join(instance_path,"},{"line_number":193,"context_line":"                            image_name + \u0027.\u0027 + format_ext.lower())"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a41bdd9_195bcd55","line":191,"in_reply_to":"ba3cc151_3c337564","updated":"2015-07-14 10:14:51.000000000","message":"Done","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"}],"nova/virt/hyperv/vmops.py":[{"author":{"_account_id":13538,"name":"Claudiu Popa","email":"cpopa@cloudbasesolutions.com","username":"PCManticore"},"change_message_id":"9f30af13a9e22ad034fb6724bbc53ec3c6dd808f","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        instance_dict \u003d {}"},{"line_number":704,"context_line":"        for item in instance.items():"},{"line_number":705,"context_line":"            instance_dict[item[0]] \u003d item[1]"},{"line_number":706,"context_line":"        return instance_dict"}],"source_content_type":"text/x-python","patch_set":2,"id":"baa201ad_8988bfc7","line":706,"updated":"2014-10-13 17:17:45.000000000","message":"And for the reference, `` new.__class__.__dict__[\u0027name\u0027].fset``, where new is an Instance objects, yields None.","commit_id":"0e913b6726c8b7dee457c97ed56e125a4c0a8296"},{"author":{"_account_id":13538,"name":"Claudiu Popa","email":"cpopa@cloudbasesolutions.com","username":"PCManticore"},"change_message_id":"892c9e303246a8e0de3c3f98d09f7ffa1164892d","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        instance_dict \u003d {}"},{"line_number":704,"context_line":"        for item in instance.items():"},{"line_number":705,"context_line":"            instance_dict[item[0]] \u003d item[1]"},{"line_number":706,"context_line":"        return instance_dict"}],"source_content_type":"text/x-python","patch_set":2,"id":"baa201ad_ce61edd4","line":706,"updated":"2014-10-13 16:31:44.000000000","message":"I just had a look at the instance class. Isn\u0027t name a property without a setter? Maybe that\u0027s why it fails to set the attribute, not due to bad copying.","commit_id":"0e913b6726c8b7dee457c97ed56e125a4c0a8296"},{"author":{"_account_id":13538,"name":"Claudiu Popa","email":"cpopa@cloudbasesolutions.com","username":"PCManticore"},"change_message_id":"804aa3bf6e120bd27d1b999c9c56243b27da879a","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        instance_dict \u003d {}"},{"line_number":704,"context_line":"        for item in instance.items():"},{"line_number":705,"context_line":"            instance_dict[item[0]] \u003d item[1]"},{"line_number":706,"context_line":"        return instance_dict"}],"source_content_type":"text/x-python","patch_set":2,"id":"baa201ad_f394f4e9","line":706,"updated":"2014-10-11 07:56:16.000000000","message":"Isnt\u0027 this equivalent to instance_dict \u003d instance.copy()?","commit_id":"0e913b6726c8b7dee457c97ed56e125a4c0a8296"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ea927c93645bc199118731c733cfc781db17d906","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        instance_dict \u003d {}"},{"line_number":704,"context_line":"        for item in instance.items():"},{"line_number":705,"context_line":"            instance_dict[item[0]] \u003d item[1]"},{"line_number":706,"context_line":"        return instance_dict"}],"source_content_type":"text/x-python","patch_set":2,"id":"baa201ad_502f4f3e","line":706,"in_reply_to":"baa201ad_8988bfc7","updated":"2014-10-13 20:59:35.000000000","message":"Well, nobody said anything about \"bad copying\". It goes without saying that the instance \u0027name\u0027 parameter was not \u0027designed\u0027 to be changed. Anyway, since we\u0027re actually spawning a new instance, the used approach seem to be the most reasonable to me. As I\u0027ve said before, I\u0027ll send a new patch, mentioning this in an inline comment.","commit_id":"0e913b6726c8b7dee457c97ed56e125a4c0a8296"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"b73e267a26ffda8ba5717ca968400dd63caee2bb","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        instance_dict \u003d {}"},{"line_number":704,"context_line":"        for item in instance.items():"},{"line_number":705,"context_line":"            instance_dict[item[0]] \u003d item[1]"},{"line_number":706,"context_line":"        return instance_dict"}],"source_content_type":"text/x-python","patch_set":2,"id":"baa201ad_fe402637","line":706,"in_reply_to":"baa201ad_f394f4e9","updated":"2014-10-13 12:45:46.000000000","message":"No, because that\u0027s not just a plain dict, but an Instance object, defined here: https://github.com/openstack/nova/blob/master/nova/objects/instance.py#L60\n\nAlthough a simple deepcopy can be used, the attributes of the resulted object can\u0027t be changed. For example changing the name attribute will raise \u0027AttributeError: attribute can\u0027t be changed\u0027.\n\nThat\u0027s the reason I\u0027m using this simple but not that pretty helper method in order to have just a plain dict that can be easily modified. I may put an inline comment, mentioning why this is required.","commit_id":"0e913b6726c8b7dee457c97ed56e125a4c0a8296"},{"author":{"_account_id":13538,"name":"Claudiu Popa","email":"cpopa@cloudbasesolutions.com","username":"PCManticore"},"change_message_id":"a4e67eae40bde8dad7f4c7f88bdb391c36fd4ca7","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        instance_dict \u003d {}"},{"line_number":704,"context_line":"        for item in instance.items():"},{"line_number":705,"context_line":"            instance_dict[item[0]] \u003d item[1]"},{"line_number":706,"context_line":"        return instance_dict"}],"source_content_type":"text/x-python","patch_set":2,"id":"baa201ad_43e076cc","line":706,"in_reply_to":"baa201ad_fe402637","updated":"2014-10-13 16:15:55.000000000","message":"I was going to suggest a comment for describing why choosing this approach. +1.","commit_id":"0e913b6726c8b7dee457c97ed56e125a4c0a8296"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c9b6c562d6ed374223d37a52c9a6bf014b526ec5","unresolved":false,"context_lines":[{"line_number":661,"context_line":"    def rescue_instance(self, context, instance, network_info):"},{"line_number":662,"context_line":"        self.power_off(instance)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"        rescue_instance_name \u003d instance[\u0027name\u0027] + \u0027-rescue\u0027"},{"line_number":665,"context_line":"        rescue_instance \u003d self._get_instance_dict(instance)"},{"line_number":666,"context_line":"        rescue_instance[\u0027name\u0027] \u003d rescue_instance_name"},{"line_number":667,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9aa7fdbe_faccc237","line":664,"updated":"2014-10-21 11:23:01.000000000","message":"the instance is an object. can you please use instance.name","commit_id":"4e83a958cab9f1705b586b69f0ddc63c7023b063"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ffced6f09506016283a0a1b56e46817e95f372d2","unresolved":false,"context_lines":[{"line_number":661,"context_line":"    def rescue_instance(self, context, instance, network_info):"},{"line_number":662,"context_line":"        self.power_off(instance)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"        rescue_instance_name \u003d instance[\u0027name\u0027] + \u0027-rescue\u0027"},{"line_number":665,"context_line":"        rescue_instance \u003d self._get_instance_dict(instance)"},{"line_number":666,"context_line":"        rescue_instance[\u0027name\u0027] \u003d rescue_instance_name"},{"line_number":667,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9aa7fdbe_3582dd4f","line":664,"in_reply_to":"9aa7fdbe_faccc237","updated":"2014-10-21 11:41:09.000000000","message":"Done","commit_id":"4e83a958cab9f1705b586b69f0ddc63c7023b063"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c9b6c562d6ed374223d37a52c9a6bf014b526ec5","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        self.power_on(rescue_instance)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    def unrescue_instance(self, instance, network_info, power_on\u003dTrue):"},{"line_number":685,"context_line":"        rescue_instance_name \u003d instance[\u0027name\u0027] + \u0027-rescue\u0027"},{"line_number":686,"context_line":"        rescue_instance \u003d self._get_instance_dict(instance)"},{"line_number":687,"context_line":"        rescue_instance[\u0027name\u0027] \u003d rescue_instance_name"},{"line_number":688,"context_line":"        instance_path \u003d self._pathutils.get_instance_dir(instance[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aa7fdbe_1ae98680","line":685,"updated":"2014-10-21 11:23:01.000000000","message":"same as comment above","commit_id":"4e83a958cab9f1705b586b69f0ddc63c7023b063"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ffced6f09506016283a0a1b56e46817e95f372d2","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        self.power_on(rescue_instance)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    def unrescue_instance(self, instance, network_info, power_on\u003dTrue):"},{"line_number":685,"context_line":"        rescue_instance_name \u003d instance[\u0027name\u0027] + \u0027-rescue\u0027"},{"line_number":686,"context_line":"        rescue_instance \u003d self._get_instance_dict(instance)"},{"line_number":687,"context_line":"        rescue_instance[\u0027name\u0027] \u003d rescue_instance_name"},{"line_number":688,"context_line":"        instance_path \u003d self._pathutils.get_instance_dir(instance[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aa7fdbe_55968195","line":685,"in_reply_to":"9aa7fdbe_1ae98680","updated":"2014-10-21 11:41:09.000000000","message":"Done","commit_id":"4e83a958cab9f1705b586b69f0ddc63c7023b063"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c9b6c562d6ed374223d37a52c9a6bf014b526ec5","unresolved":false,"context_lines":[{"line_number":700,"context_line":"            self.power_on(instance)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"    def _get_instance_dict(self, instance):"},{"line_number":703,"context_line":"        # As some of the Instance object attributes cannot be modifieded,"},{"line_number":704,"context_line":"        # this approach is used in order to parse information about rescue"},{"line_number":705,"context_line":"        # instances."},{"line_number":706,"context_line":"        instance_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aa7fdbe_7afff234","line":703,"updated":"2014-10-21 11:23:01.000000000","message":"modifieded \u003d\u003e modified","commit_id":"4e83a958cab9f1705b586b69f0ddc63c7023b063"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ffced6f09506016283a0a1b56e46817e95f372d2","unresolved":false,"context_lines":[{"line_number":700,"context_line":"            self.power_on(instance)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"    def _get_instance_dict(self, instance):"},{"line_number":703,"context_line":"        # As some of the Instance object attributes cannot be modifieded,"},{"line_number":704,"context_line":"        # this approach is used in order to parse information about rescue"},{"line_number":705,"context_line":"        # instances."},{"line_number":706,"context_line":"        instance_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aa7fdbe_759385a3","line":703,"in_reply_to":"9aa7fdbe_7afff234","updated":"2014-10-21 11:41:09.000000000","message":"Done","commit_id":"4e83a958cab9f1705b586b69f0ddc63c7023b063"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"fe9e0beaa52c4b6359c3e1cb4ceb7b1fd5777373","unresolved":false,"context_lines":[{"line_number":689,"context_line":"                self._vhdutils.create_differencing_vhd(rescue_image_path,"},{"line_number":690,"context_line":"                                                       base_vhd_path)"},{"line_number":691,"context_line":"            else:"},{"line_number":692,"context_line":"                self._pathutils.copyfile(base_vhd_path, rescue_image_path)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"            self.create_instance(rescue_instance, network_info, None,"},{"line_number":695,"context_line":"                                 rescue_image_path, root_vhd_path)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_2d1840d2","line":692,"updated":"2014-11-25 12:48:15.000000000","message":"this looks a lot like _create_root_vhd. Can\u0027t a common denominator be made?","commit_id":"4b35de615cbf55caf99de77117cac1ac10499d71"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"463b27788846b2795e24164af5e998ddd85ac5a8","unresolved":false,"context_lines":[{"line_number":689,"context_line":"                self._vhdutils.create_differencing_vhd(rescue_image_path,"},{"line_number":690,"context_line":"                                                       base_vhd_path)"},{"line_number":691,"context_line":"            else:"},{"line_number":692,"context_line":"                self._pathutils.copyfile(base_vhd_path, rescue_image_path)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"            self.create_instance(rescue_instance, network_info, None,"},{"line_number":695,"context_line":"                                 rescue_image_path, root_vhd_path)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_43439d6b","line":692,"in_reply_to":"5a890539_2d1840d2","updated":"2014-11-25 13:37:26.000000000","message":"I thought about doing that but _create_root_vhd is already extremely convoluted.","commit_id":"4b35de615cbf55caf99de77117cac1ac10499d71"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"6c4a43bfe19c25ec25e77459a256227629cd6bfa","unresolved":false,"context_lines":[{"line_number":689,"context_line":"                self._vhdutils.create_differencing_vhd(rescue_image_path,"},{"line_number":690,"context_line":"                                                       base_vhd_path)"},{"line_number":691,"context_line":"            else:"},{"line_number":692,"context_line":"                self._pathutils.copyfile(base_vhd_path, rescue_image_path)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"            self.create_instance(rescue_instance, network_info, None,"},{"line_number":695,"context_line":"                                 rescue_image_path, root_vhd_path)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_5c2312be","line":692,"in_reply_to":"5a890539_43439d6b","updated":"2014-11-28 17:04:27.000000000","message":"Done","commit_id":"4b35de615cbf55caf99de77117cac1ac10499d71"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99a30d9ead409aa691675408b664490e9f05412d","unresolved":false,"context_lines":[{"line_number":697,"context_line":"                instance_uuid \u003d os.path.basename(vm_serial_conn)"},{"line_number":698,"context_line":"                self.log_vm_serial_output(instance_name, instance_uuid)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    def rescue_instance(self, context, instance, network_info,"},{"line_number":701,"context_line":"                        rescue_password):"},{"line_number":702,"context_line":"        self.power_off(instance)"},{"line_number":703,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_cc1da275","line":700,"updated":"2015-01-21 21:51:44.000000000","message":"it looks to me that this method looks a looooot like spawn. Sure there are some differences, like attaching the volumes, boot from volume part (also, see comment below), vm generation.\n\nIt would be great if we can somehow factor out the code. If it\u0027s possible ofcourse.","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ebf73f5118b6ad5cf8dd16c78f14214fcb4e8723","unresolved":false,"context_lines":[{"line_number":697,"context_line":"                instance_uuid \u003d os.path.basename(vm_serial_conn)"},{"line_number":698,"context_line":"                self.log_vm_serial_output(instance_name, instance_uuid)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    def rescue_instance(self, context, instance, network_info,"},{"line_number":701,"context_line":"                        rescue_password):"},{"line_number":702,"context_line":"        self.power_off(instance)"},{"line_number":703,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_49050d79","line":700,"in_reply_to":"1a930d6b_cc1da275","updated":"2015-01-22 12:59:54.000000000","message":"They may seem similar, but putting all this logic in one single method would make it extremely convoluted.\n\nI\u0027ve tried avoiding common code as much as possible but up to a reasonable point.","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99a30d9ead409aa691675408b664490e9f05412d","unresolved":false,"context_lines":[{"line_number":710,"context_line":"            root_vhd_path \u003d self._pathutils.get_root_vhd_path(instance.name,"},{"line_number":711,"context_line":"                                                              format_ext)"},{"line_number":712,"context_line":"            rescue_vhd_path \u003d self._create_root_vhd(context, instance,"},{"line_number":713,"context_line":"                                                    rescue\u003dTrue)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"            self.create_instance(rescue_instance, network_info, None,"},{"line_number":716,"context_line":"                                 rescue_vhd_path, root_vhd_path)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_0c3b2a3b","line":713,"updated":"2015-01-21 21:51:44.000000000","message":"what if the instance is boot from volume? Can it be rescued? Or this is only for instances that boots from disk?","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ebf73f5118b6ad5cf8dd16c78f14214fcb4e8723","unresolved":false,"context_lines":[{"line_number":710,"context_line":"            root_vhd_path \u003d self._pathutils.get_root_vhd_path(instance.name,"},{"line_number":711,"context_line":"                                                              format_ext)"},{"line_number":712,"context_line":"            rescue_vhd_path \u003d self._create_root_vhd(context, instance,"},{"line_number":713,"context_line":"                                                    rescue\u003dTrue)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"            self.create_instance(rescue_instance, network_info, None,"},{"line_number":716,"context_line":"                                 rescue_vhd_path, root_vhd_path)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_49618d38","line":713,"in_reply_to":"1a930d6b_0c3b2a3b","updated":"2015-01-22 12:59:54.000000000","message":"Instance booted from a volume cannot be rescued ATM.\n\nThis would be possible if nova rescue would allow specifying a rescue image but that\u0027s out of the scope of this BP.","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99a30d9ead409aa691675408b664490e9f05412d","unresolved":false,"context_lines":[{"line_number":713,"context_line":"                                                    rescue\u003dTrue)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"            self.create_instance(rescue_instance, network_info, None,"},{"line_number":716,"context_line":"                                 rescue_vhd_path, root_vhd_path)"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"            if configdrive.required_by(instance):"},{"line_number":719,"context_line":"                configdrive_path \u003d self._create_config_drive(instance,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_6c582e57","line":716,"updated":"2015-01-21 21:51:44.000000000","message":"also, I think you should consider vm generation too, since my blueprint merged. :D","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ebf73f5118b6ad5cf8dd16c78f14214fcb4e8723","unresolved":false,"context_lines":[{"line_number":713,"context_line":"                                                    rescue\u003dTrue)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"            self.create_instance(rescue_instance, network_info, None,"},{"line_number":716,"context_line":"                                 rescue_vhd_path, root_vhd_path)"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"            if configdrive.required_by(instance):"},{"line_number":719,"context_line":"                configdrive_path \u003d self._create_config_drive(instance,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_49c8ad22","line":716,"in_reply_to":"1a930d6b_6c582e57","updated":"2015-01-22 12:59:54.000000000","message":"Indeed, thanks for pointing this out!","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99a30d9ead409aa691675408b664490e9f05412d","unresolved":false,"context_lines":[{"line_number":745,"context_line":"        # instances."},{"line_number":746,"context_line":"        instance_dict \u003d {}"},{"line_number":747,"context_line":"        for field, value in instance.items():"},{"line_number":748,"context_line":"            instance_dict[field] \u003d value"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        rescue_instance \u003d objects_base.NovaObject(**instance_dict)"},{"line_number":751,"context_line":"        rescue_instance.name +\u003d constants.VM_RESCUE_SUFFIX"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_ec5a5e82","line":748,"updated":"2015-01-21 21:51:44.000000000","message":"I assume instance is an objects.Instance instance (too many instance... sorry). Then, it should already have a method named obj_to_primitive, or something like that, or at least, it should exist in objects.Base.\n\nI don\u0027t think instance is a dict..","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ebf73f5118b6ad5cf8dd16c78f14214fcb4e8723","unresolved":false,"context_lines":[{"line_number":745,"context_line":"        # instances."},{"line_number":746,"context_line":"        instance_dict \u003d {}"},{"line_number":747,"context_line":"        for field, value in instance.items():"},{"line_number":748,"context_line":"            instance_dict[field] \u003d value"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        rescue_instance \u003d objects_base.NovaObject(**instance_dict)"},{"line_number":751,"context_line":"        rescue_instance.name +\u003d constants.VM_RESCUE_SUFFIX"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_ecbfa7fa","line":748,"in_reply_to":"1a930d6b_ec5a5e82","updated":"2015-01-22 12:59:54.000000000","message":"Instance objects can be parsed just like dicts in this case. I thought about using obj_to_primitive or NovaObjectSerializer but that would not have allowed me to change the instance name.","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"afcc65ede390a1bef384699bad8c10af5380b0e2","unresolved":false,"context_lines":[{"line_number":747,"context_line":"        for field, value in instance.items():"},{"line_number":748,"context_line":"            instance_dict[field] \u003d value"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        rescue_instance \u003d objects_base.NovaObject(**instance_dict)"},{"line_number":751,"context_line":"        rescue_instance.name +\u003d constants.VM_RESCUE_SUFFIX"},{"line_number":752,"context_line":"        rescue_instance.fields \u003d instance_dict"},{"line_number":753,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_67f129cd","line":750,"updated":"2015-01-21 22:02:01.000000000","message":"Also, not reaally sure what you\u0027re trying to do here...","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ebf73f5118b6ad5cf8dd16c78f14214fcb4e8723","unresolved":false,"context_lines":[{"line_number":747,"context_line":"        for field, value in instance.items():"},{"line_number":748,"context_line":"            instance_dict[field] \u003d value"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        rescue_instance \u003d objects_base.NovaObject(**instance_dict)"},{"line_number":751,"context_line":"        rescue_instance.name +\u003d constants.VM_RESCUE_SUFFIX"},{"line_number":752,"context_line":"        rescue_instance.fields \u003d instance_dict"},{"line_number":753,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_0ce6b3b4","line":750,"in_reply_to":"1a930d6b_67f129cd","updated":"2015-01-22 12:59:54.000000000","message":"Well, the vmops methods need an instance object. I\u0027m using this approach because of the fact that instance objects do not allow you to change the instance name (on purpose, I think).\n\nEither this, or I would\u0027ve had to duplicate a lot of vmops code just to bring the same behaviour.\n\nAs I\u0027ve said, this seemed the most reasonable and least intrusive approach, but please let me know if you have a better idea.","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99a30d9ead409aa691675408b664490e9f05412d","unresolved":false,"context_lines":[{"line_number":748,"context_line":"            instance_dict[field] \u003d value"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        rescue_instance \u003d objects_base.NovaObject(**instance_dict)"},{"line_number":751,"context_line":"        rescue_instance.name +\u003d constants.VM_RESCUE_SUFFIX"},{"line_number":752,"context_line":"        rescue_instance.fields \u003d instance_dict"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        return rescue_instance"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_0c732aea","line":751,"updated":"2015-01-21 21:51:44.000000000","message":"corect me if I\u0027m wrong, but doesn\u0027t this cause an erroneous logic? You append the suffix to the instance name. Fine, but then you call self._pathutils.get_instance_dir or instance_path (some call to PathUtils anyways, you call it from _create_root_vhd) with rescue\u003dTrue, which then appends the suffix again? I\u0027m pretty sure you do.\n\nIf it is true, I\u0027d say that maybe you don\u0027t actually need to add the rescue argument everywhere. (maybe, but it would be cool).","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ebf73f5118b6ad5cf8dd16c78f14214fcb4e8723","unresolved":false,"context_lines":[{"line_number":748,"context_line":"            instance_dict[field] \u003d value"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        rescue_instance \u003d objects_base.NovaObject(**instance_dict)"},{"line_number":751,"context_line":"        rescue_instance.name +\u003d constants.VM_RESCUE_SUFFIX"},{"line_number":752,"context_line":"        rescue_instance.fields \u003d instance_dict"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        return rescue_instance"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_7703800d","line":751,"in_reply_to":"1a930d6b_0c732aea","updated":"2015-01-22 12:59:54.000000000","message":"In some cases, a \u0027real\u0027 instance object was needed, for example when caching instance image. That\u0027s the place where I had to put \u0027rescue\u0027 flags.\n\nSo, those methods that have the rescue flag actually recieve the \u0027real\u0027 instance object and the rescue suffix won\u0027t be applied twice. This is considered in the unit tests.","commit_id":"20d9f48905eb9b8e069abc7d3618ba43b1ad649a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"5dc52a94773209555233eb4d9516c879d3005365","unresolved":false,"context_lines":[{"line_number":774,"context_line":"                return self._instance.get(key, *args, **kwargs)"},{"line_number":775,"context_line":"        return RescueInstance(instance)"},{"line_number":776,"context_line":""},{"line_number":777,"context_line":"    def _is_resqued_instance(self, instance):"},{"line_number":778,"context_line":"        return (instance[\u0027vm_state\u0027] \u003d\u003d vm_states.RESCUED and not"},{"line_number":779,"context_line":"                constants.VM_RESCUE_SUFFIX in instance.name)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_fbd47fbe","line":777,"updated":"2015-01-23 19:15:26.000000000","message":"rescued*","commit_id":"7662d5de35ed2eb7a809bf9186eb0d27576bbaa1"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"3e16d522b5594ab9b7ad5e67d9e76eb0a59c35b9","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        LOG.info(_LI(\"Got request to destroy instance\"), instance\u003dinstance)"},{"line_number":460,"context_line":"        try:"},{"line_number":461,"context_line":"            if self._vmutils.vm_exists(instance_name):"},{"line_number":462,"context_line":"                if self._is_rescued_instance(instance):"},{"line_number":463,"context_line":"                    self.unrescue_instance(instance, power_on\u003dFalse)"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"                # Stop the VM first."}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_cf4884ce","line":462,"updated":"2015-02-05 15:35:41.000000000","message":"This should be outside the guard, which would be more robust in the error case that the original VM no longer exists.","commit_id":"925deccdfd08871238fbfea24409b59e28fe9b38"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"3e16d522b5594ab9b7ad5e67d9e76eb0a59c35b9","unresolved":false,"context_lines":[{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    def get_console_output(self, instance):"},{"line_number":651,"context_line":"        if self._is_rescued_instance(instance):"},{"line_number":652,"context_line":"            instance \u003d self._get_rescue_instance(instance)"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        console_log_paths \u003d ("},{"line_number":655,"context_line":"            self._pathutils.get_vm_console_log_paths(instance[\u0027name\u0027]))"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_8ffcccb9","line":652,"updated":"2015-02-05 15:35:41.000000000","message":"This is an example of an edge cases I was talking about. It\u0027s handled here, but when Nova introduces new feature X, somebody is going to have to remember the rescue instance edge case yet again. It\u0027s fragile and I think it\u0027s a bad design.\n\nE.g. until relatively recently Nova allowed suspend of a rescued instance, which broke everything.","commit_id":"925deccdfd08871238fbfea24409b59e28fe9b38"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"3e16d522b5594ab9b7ad5e67d9e76eb0a59c35b9","unresolved":false,"context_lines":[{"line_number":777,"context_line":"        return RescueInstance(instance)"},{"line_number":778,"context_line":""},{"line_number":779,"context_line":"    def _is_rescued_instance(self, instance):"},{"line_number":780,"context_line":"        is_rescue_instance \u003d constants.VM_RESCUE_SUFFIX in instance.name"},{"line_number":781,"context_line":"        if is_rescue_instance:"},{"line_number":782,"context_line":"            return False"},{"line_number":783,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_cfe6c443","line":780,"updated":"2015-02-05 15:35:41.000000000","message":"This be checking that VM_RESCUE_SUFFIX is a suffix, rather than contained in the string at all. However, consider that instance.name is a user-provided string. What happens to this code if they gave it a name containing VM_RESCUE_SUFFIX? You probably shouldn\u0027t be basing this on anything provided by the user.","commit_id":"925deccdfd08871238fbfea24409b59e28fe9b38"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"6e9f8625eb2ebd1989170bd63f1bc5b0a4e1039c","unresolved":false,"context_lines":[{"line_number":719,"context_line":"                 \u0027vm_gen\u0027: vm_gen})"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        # At the moment, instances booted from volume cannot be rescued,"},{"line_number":722,"context_line":"        # so this code goes under this assumption."},{"line_number":723,"context_line":"        root_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name)"},{"line_number":724,"context_line":"        controller_type \u003d VM_GENERATIONS_CONTROLLER_TYPES[vm_gen]"},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_224abb27","line":722,"updated":"2015-02-09 10:20:56.000000000","message":"As noted below, I think you need to assert what you support here.\n\nRight now, if a user does rescue on an instance booted from volume, it looks to me like the following will happen:\n\n* root_vhd_path will return a non-existent path\n* self._vmutils.detach_vm_disk will silently do nothing [1]\n* New disk with invalid path with be added [2]\n\nThis definitely won\u0027t work as the user intends. As it\u0027s unsupported at the moment that\u0027s fine, but it would be much nicer to the user to tell them that with a clear error message rather than leaving them wondering why their rescued instance doesn\u0027t work.\n\nAlso, I haven\u0027t looked at the interaction with unrescue, but it\u0027s critical that the above mess can be unwound with unrescue. If it currently work it\u0027s presumably just luck :)\n\nTL;DR\n\nNot supporting everything is fine, but I think you need to explicitly check that root_vhd_path exists and there is only 1 disk. If not, you need to error out early.\n\n[1] This might be generally bad. Seems like the sort of thing you\u0027d want to know if it didn\u0027t work. Separate issue, though.\n[2] I don\u0027t know if this will explode or not.","commit_id":"61f903199406c30fad09544d99d13b851d16dbcd"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"069d13416f5aab522628c5cd710a0675dc68f3cf","unresolved":false,"context_lines":[{"line_number":719,"context_line":"                 \u0027vm_gen\u0027: vm_gen})"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        # At the moment, instances booted from volume cannot be rescued,"},{"line_number":722,"context_line":"        # so this code goes under this assumption."},{"line_number":723,"context_line":"        root_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name)"},{"line_number":724,"context_line":"        controller_type \u003d VM_GENERATIONS_CONTROLLER_TYPES[vm_gen]"},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_7d47f64b","line":722,"in_reply_to":"da86d52c_224abb27","updated":"2015-02-09 11:11:30.000000000","message":"ATM, the API does not allow rescuing VMs booted from volume. Anyway, this may change in the future so it\u0027s a good idea to make an assertion.","commit_id":"61f903199406c30fad09544d99d13b851d16dbcd"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"6e9f8625eb2ebd1989170bd63f1bc5b0a4e1039c","unresolved":false,"context_lines":[{"line_number":728,"context_line":"        self._attach_drive(instance.name, rescue_vhd_path, 0,"},{"line_number":729,"context_line":"                           self._ROOT_DISK_CTRL_ADDR, controller_type)"},{"line_number":730,"context_line":"        self._vmutils.attach_scsi_drive(instance.name, root_vhd_path,"},{"line_number":731,"context_line":"                                        drive_type\u003dconstants.DISK)"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"        if configdrive.required_by(instance):"},{"line_number":734,"context_line":"            self._detach_config_drive(instance.name)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_a44ebb94","line":731,"updated":"2015-02-09 10:20:56.000000000","message":"So we\u0027re doing:\n\n* Remove the root disk\n* Add the rescue disk\n* Add the root disk again\n\nPresumably this dance means that under certain constraints (which don\u0027t seem to be asserted here, btw, which could lead to oddness), we\u0027re left with the rescue disk \u0027first\u0027 followed by the root disk. This does seem to preclude the possibility of rescuing an instance with multiple disks.\n\nA quick scan of the docs reveals that Msvm_BIOSElement has a boot order array. Couldn\u0027t you just leave everything as is, tack the rescue image on the end, and boot from it?","commit_id":"61f903199406c30fad09544d99d13b851d16dbcd"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"069d13416f5aab522628c5cd710a0675dc68f3cf","unresolved":false,"context_lines":[{"line_number":728,"context_line":"        self._attach_drive(instance.name, rescue_vhd_path, 0,"},{"line_number":729,"context_line":"                           self._ROOT_DISK_CTRL_ADDR, controller_type)"},{"line_number":730,"context_line":"        self._vmutils.attach_scsi_drive(instance.name, root_vhd_path,"},{"line_number":731,"context_line":"                                        drive_type\u003dconstants.DISK)"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"        if configdrive.required_by(instance):"},{"line_number":734,"context_line":"            self._detach_config_drive(instance.name)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_d80e30e5","line":731,"in_reply_to":"da86d52c_a44ebb94","updated":"2015-02-09 11:11:30.000000000","message":"Well, there are a few constraints here for which reason I chose this approach.\n\nIn case of generation 1 VMs, you can boot only from the IDE 0 virtual hard disk. So, you may move up the boot order CD drives, network adapters, but not specific virtual hard disks.\n\nI\u0027ll add a few more checks here.","commit_id":"61f903199406c30fad09544d99d13b851d16dbcd"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5b4f6c5a72e7ace2de00af9ce9d45823555e90b7","unresolved":false,"context_lines":[{"line_number":720,"context_line":"                 \u0027vm_gen\u0027: vm_gen})"},{"line_number":721,"context_line":""},{"line_number":722,"context_line":"        root_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name)"},{"line_number":723,"context_line":"        if not root_vhd_path:"},{"line_number":724,"context_line":"            err_msg \u003d _(\u0027Instance root disk image could not be found. \u0027"},{"line_number":725,"context_line":"                        \u0027Rescuing instances booted from volume is \u0027"},{"line_number":726,"context_line":"                        \u0027not supported.\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_bce40bad","line":723,"updated":"2015-02-09 13:33:49.000000000","message":"Not quite, because root_vhd_path will never be None here. All the pathutils function seems to do is construct the path for the root disk. It doesn\u0027t check that it actually has one.","commit_id":"1ba21912f4d62e7cc15e1cb2de6b6bb8f5e71209"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"59093297070e296a825a7ee99235e261fcd0076d","unresolved":false,"context_lines":[{"line_number":720,"context_line":"                 \u0027vm_gen\u0027: vm_gen})"},{"line_number":721,"context_line":""},{"line_number":722,"context_line":"        root_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name)"},{"line_number":723,"context_line":"        if not root_vhd_path:"},{"line_number":724,"context_line":"            err_msg \u003d _(\u0027Instance root disk image could not be found. \u0027"},{"line_number":725,"context_line":"                        \u0027Rescuing instances booted from volume is \u0027"},{"line_number":726,"context_line":"                        \u0027not supported.\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_a76b1484","line":723,"in_reply_to":"da86d52c_a71cf46b","updated":"2015-02-09 13:45:20.000000000","message":"You\u0027re quite right. I misread the pathutils function.","commit_id":"1ba21912f4d62e7cc15e1cb2de6b6bb8f5e71209"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"b67518262db2779eab6bca0c24d33881cb72668e","unresolved":false,"context_lines":[{"line_number":720,"context_line":"                 \u0027vm_gen\u0027: vm_gen})"},{"line_number":721,"context_line":""},{"line_number":722,"context_line":"        root_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name)"},{"line_number":723,"context_line":"        if not root_vhd_path:"},{"line_number":724,"context_line":"            err_msg \u003d _(\u0027Instance root disk image could not be found. \u0027"},{"line_number":725,"context_line":"                        \u0027Rescuing instances booted from volume is \u0027"},{"line_number":726,"context_line":"                        \u0027not supported.\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_a71cf46b","line":723,"in_reply_to":"da86d52c_bce40bad","updated":"2015-02-09 13:39:22.000000000","message":"Actually, the lookup_.* methods construct the path using possible extensions and return the path that exists, if any.\n\nSo in case the root vhd path does not exist, it will return None.","commit_id":"1ba21912f4d62e7cc15e1cb2de6b6bb8f5e71209"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"6033b66d2572567c56088901d6d9151e395e820b","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        if not CONF.hyperv.config_drive_cdrom:"},{"line_number":413,"context_line":"            configdrive_path \u003d self._pathutils.get_configdrive_path("},{"line_number":414,"context_line":"                instance.name, constants.DISK_FORMAT_VHD, rescue\u003drescue)"},{"line_number":415,"context_line":"            utils.execute(CONF.hyperv.qemu_img_cmd,"},{"line_number":416,"context_line":"                          \u0027convert\u0027,"},{"line_number":417,"context_line":"                          \u0027-f\u0027,"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_b2a9dee1","line":414,"updated":"2015-06-21 10:16:40.000000000","message":"the instance name is not unique - any reason why you are not using the instance uuid here?","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d7d796ac58372f543020abff17d97d7da8c3e774","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        if not CONF.hyperv.config_drive_cdrom:"},{"line_number":413,"context_line":"            configdrive_path \u003d self._pathutils.get_configdrive_path("},{"line_number":414,"context_line":"                instance.name, constants.DISK_FORMAT_VHD, rescue\u003drescue)"},{"line_number":415,"context_line":"            utils.execute(CONF.hyperv.qemu_img_cmd,"},{"line_number":416,"context_line":"                          \u0027convert\u0027,"},{"line_number":417,"context_line":"                          \u0027-f\u0027,"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_32e4ee39","line":414,"in_reply_to":"fa32b979_b2a9dee1","updated":"2015-06-21 10:30:45.000000000","message":"Note that this is not the instance display name, but something like \"instance-00000XYZ\". At the moment, the hyper-v driver identifies instances by this name.\n\nWe plan on switching to instance.uuid soon, but this is out of the scope of this patch as it requires quite a refactoring.","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"6033b66d2572567c56088901d6d9151e395e820b","unresolved":false,"context_lines":[{"line_number":726,"context_line":"                        rescue_password):"},{"line_number":727,"context_line":"        try:"},{"line_number":728,"context_line":"            self._rescue_instance(context, instance, network_info,"},{"line_number":729,"context_line":"                                  image_meta, rescue_password)"},{"line_number":730,"context_line":"        except Exception:"},{"line_number":731,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":732,"context_line":"                self.unrescue_instance(instance)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_72acb6ed","line":729,"updated":"2015-06-21 10:16:40.000000000","message":"maybe for debugging try and add in some log messages here","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d7d796ac58372f543020abff17d97d7da8c3e774","unresolved":false,"context_lines":[{"line_number":726,"context_line":"                        rescue_password):"},{"line_number":727,"context_line":"        try:"},{"line_number":728,"context_line":"            self._rescue_instance(context, instance, network_info,"},{"line_number":729,"context_line":"                                  image_meta, rescue_password)"},{"line_number":730,"context_line":"        except Exception:"},{"line_number":731,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":732,"context_line":"                self.unrescue_instance(instance)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_f2d44648","line":729,"in_reply_to":"fa32b979_72acb6ed","updated":"2015-06-21 10:30:45.000000000","message":"Done","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"6033b66d2572567c56088901d6d9151e395e820b","unresolved":false,"context_lines":[{"line_number":781,"context_line":"    def unrescue_instance(self, instance):"},{"line_number":782,"context_line":"        self.power_off(instance)"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"        root_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name)"},{"line_number":785,"context_line":"        rescue_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name,"},{"line_number":786,"context_line":"                                                               rescue\u003dTrue)"},{"line_number":787,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_32b62e3e","line":784,"updated":"2015-06-21 10:16:40.000000000","message":"same point as above about the instance name","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d7d796ac58372f543020abff17d97d7da8c3e774","unresolved":false,"context_lines":[{"line_number":781,"context_line":"    def unrescue_instance(self, instance):"},{"line_number":782,"context_line":"        self.power_off(instance)"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"        root_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name)"},{"line_number":785,"context_line":"        rescue_vhd_path \u003d self._pathutils.lookup_root_vhd_path(instance.name,"},{"line_number":786,"context_line":"                                                               rescue\u003dTrue)"},{"line_number":787,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"fa32b979_72c11680","line":784,"in_reply_to":"fa32b979_32b62e3e","updated":"2015-06-21 10:30:45.000000000","message":"Done","commit_id":"162b95248663ebb4014515098cb4bd441e8118d2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff5d55034f4d229d3e36d719449b8c88b3bcc7e3","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                self._vhdutils.get_internal_vhd_size_by_file_size("},{"line_number":220,"context_line":"                    base_vhd_path, root_vhd_size))"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"            if not is_rescue_vhd and self._is_resize_needed("},{"line_number":223,"context_line":"                    root_vhd_path, base_vhd_size,"},{"line_number":224,"context_line":"                    root_vhd_internal_size, instance):"},{"line_number":225,"context_line":"                self._vhdutils.resize_vhd(root_vhd_path,"}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_bc1ea5b9","line":222,"updated":"2015-07-14 09:50:33.000000000","message":"Oh, so you don\u0027t resize on rescue, I can\u0027t remember if thats normal or not.","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff5d55034f4d229d3e36d719449b8c88b3bcc7e3","unresolved":false,"context_lines":[{"line_number":734,"context_line":"                err_msg \u003d _LE(\"Instance rescue failed. Exception: %(exc)s. \""},{"line_number":735,"context_line":"                              \"Attempting to unrescue the instance.\")"},{"line_number":736,"context_line":"                LOG.error(err_msg, {\u0027exc\u0027: exc}, instance\u003dinstance)"},{"line_number":737,"context_line":"                self.unrescue_instance(instance)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def _rescue_instance(self, context, instance, network_info, image_meta,"},{"line_number":740,"context_line":"                         rescue_password):"}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_ff941f8d","line":737,"updated":"2015-07-14 09:50:33.000000000","message":"doesn\u0027t that not really depend on what has failed? not sure that will work in all cases :(","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"51eae342269f5070132fd237de9723dec8f55139","unresolved":false,"context_lines":[{"line_number":734,"context_line":"                err_msg \u003d _LE(\"Instance rescue failed. Exception: %(exc)s. \""},{"line_number":735,"context_line":"                              \"Attempting to unrescue the instance.\")"},{"line_number":736,"context_line":"                LOG.error(err_msg, {\u0027exc\u0027: exc}, instance\u003dinstance)"},{"line_number":737,"context_line":"                self.unrescue_instance(instance)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def _rescue_instance(self, context, instance, network_info, image_meta,"},{"line_number":740,"context_line":"                         rescue_password):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a41bdd9_143e34b8","line":737,"in_reply_to":"ba3cc151_ff941f8d","updated":"2015-07-14 10:14:51.000000000","message":"Well, I thought we should still attempt to unrescue the instance in this case.","commit_id":"c78230aa9700a2ed910cb24690f01709f39dd577"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f31b5778148b5b81f5de351db22a5a8d3076c8bc","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        base_vhd_info \u003d self._vhdutils.get_vhd_info(base_vhd_path)"},{"line_number":187,"context_line":"        base_vhd_size \u003d base_vhd_info[\u0027MaxInternalSize\u0027]"},{"line_number":188,"context_line":"        format_ext \u003d base_vhd_path.split(\u0027.\u0027)[-1]"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        root_vhd_path \u003d self._pathutils.get_root_vhd_path(instance.name,"},{"line_number":191,"context_line":"                                                          format_ext,"},{"line_number":192,"context_line":"                                                          is_rescue_vhd)"}],"source_content_type":"text/x-python","patch_set":33,"id":"3a50d1a3_87d6e925","line":189,"updated":"2015-07-30 16:31:46.000000000","message":"Random whitespace damage :(","commit_id":"6901ee73974120c9b2c5cdff18e9da8239c31103"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"327d3f97360a962baa2ea200793fabd7fe6eae73","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        base_vhd_info \u003d self._vhdutils.get_vhd_info(base_vhd_path)"},{"line_number":187,"context_line":"        base_vhd_size \u003d base_vhd_info[\u0027MaxInternalSize\u0027]"},{"line_number":188,"context_line":"        format_ext \u003d base_vhd_path.split(\u0027.\u0027)[-1]"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        root_vhd_path \u003d self._pathutils.get_root_vhd_path(instance.name,"},{"line_number":191,"context_line":"                                                          format_ext,"},{"line_number":192,"context_line":"                                                          is_rescue_vhd)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a4dcd0f_ed577100","line":189,"in_reply_to":"3a50d1a3_87d6e925","updated":"2015-08-04 14:59:08.000000000","message":"Done","commit_id":"6901ee73974120c9b2c5cdff18e9da8239c31103"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"97f18281231577fc8189430fbe167b61c14971d5","unresolved":false,"context_lines":[{"line_number":856,"context_line":"                not (rescue_vhd_path and root_vhd_path)):"},{"line_number":857,"context_line":"            err_msg \u003d _(\u0027Missing instance root and/or rescue image. \u0027"},{"line_number":858,"context_line":"                        \u0027The instance cannot be unrescued.\u0027)"},{"line_number":859,"context_line":"            raise exception.InstanceNotRescuable(err_msg)"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        vm_gen \u003d self._vmutils.get_vm_generation(instance.name)"},{"line_number":862,"context_line":"        controller_type \u003d VM_GENERATIONS_CONTROLLER_TYPES[vm_gen]"}],"source_content_type":"text/x-python","patch_set":36,"id":"7a740942_066c3907","line":859,"updated":"2015-12-09 20:20:45.000000000","message":"this should be better.\n\n            err_msg \u003d _(\u0027Missing instance root and/or rescue image.\u0027)\n            raise exception.InstanceNotRescuable(reason\u003derr_msg,\n                                                 instance_id\u003dinstance.uuid)","commit_id":"34d40f98b55dddffa11fec2dad9acaf0d6f507f7"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"868a35c78239fb72f7a51f1f403d12b6862e77eb","unresolved":false,"context_lines":[{"line_number":856,"context_line":"                not (rescue_vhd_path and root_vhd_path)):"},{"line_number":857,"context_line":"            err_msg \u003d _(\u0027Missing instance root and/or rescue image. \u0027"},{"line_number":858,"context_line":"                        \u0027The instance cannot be unrescued.\u0027)"},{"line_number":859,"context_line":"            raise exception.InstanceNotRescuable(err_msg)"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        vm_gen \u003d self._vmutils.get_vm_generation(instance.name)"},{"line_number":862,"context_line":"        controller_type \u003d VM_GENERATIONS_CONTROLLER_TYPES[vm_gen]"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_a1409c57","line":859,"in_reply_to":"7a740942_066c3907","updated":"2015-12-23 14:15:28.000000000","message":"Good point. Done.","commit_id":"34d40f98b55dddffa11fec2dad9acaf0d6f507f7"}],"nova/virt/hyperv/vmutilsv2.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"21dac98862808a48b0b6b4fa4cb2012ea9c57d69","unresolved":false,"context_lines":[{"line_number":324,"context_line":"    def get_vm_gen(self, instance_name):"},{"line_number":325,"context_line":"        vm \u003d self._lookup_vm_check(instance_name)"},{"line_number":326,"context_line":"        vm_settings \u003d self._get_vm_setting_data(vm)"},{"line_number":327,"context_line":"        vm_gen \u003d getattr(vm_settings, \u0027VirtualSystemSubType\u0027,"},{"line_number":328,"context_line":"                         self._VIRTUAL_SYSTEM_SUBTYPE_GEN1)"},{"line_number":329,"context_line":"        return int(vm_gen.split(\u0027:\u0027)[-1])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_c69f42b3","line":327,"updated":"2015-05-13 23:04:00.000000000","message":"have VirtualSystemSubType as a constant?","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f43b0f527f5ca86c76e6c7def0cb860795177966","unresolved":false,"context_lines":[{"line_number":324,"context_line":"    def get_vm_gen(self, instance_name):"},{"line_number":325,"context_line":"        vm \u003d self._lookup_vm_check(instance_name)"},{"line_number":326,"context_line":"        vm_settings \u003d self._get_vm_setting_data(vm)"},{"line_number":327,"context_line":"        vm_gen \u003d getattr(vm_settings, \u0027VirtualSystemSubType\u0027,"},{"line_number":328,"context_line":"                         self._VIRTUAL_SYSTEM_SUBTYPE_GEN1)"},{"line_number":329,"context_line":"        return int(vm_gen.split(\u0027:\u0027)[-1])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_9af62fd6","line":327,"in_reply_to":"7a016987_c69f42b3","updated":"2015-05-14 12:31:06.000000000","message":"Done","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"21dac98862808a48b0b6b4fa4cb2012ea9c57d69","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        vm \u003d self._lookup_vm_check(instance_name)"},{"line_number":326,"context_line":"        vm_settings \u003d self._get_vm_setting_data(vm)"},{"line_number":327,"context_line":"        vm_gen \u003d getattr(vm_settings, \u0027VirtualSystemSubType\u0027,"},{"line_number":328,"context_line":"                         self._VIRTUAL_SYSTEM_SUBTYPE_GEN1)"},{"line_number":329,"context_line":"        return int(vm_gen.split(\u0027:\u0027)[-1])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_065f9a0f","line":328,"updated":"2015-05-13 23:04:00.000000000","message":"well, this is a bit inefficient. Always splitting _VIRTUAL_SYSTEM_SUBTYPE_GEN1 in Hyper-V 2012. why not:\n\n    if hasattr(vm_settings, \"VirtualSystemSubType\"):\n        return int(vm_settings.VirtualSystemSubType.split(\u0027:\u0027)[-1])\n    \n    # Window Hyper-V / Server 2012 vm_settings do not have the attribute\n    # VirtualSystemSubType and they are always Generation 1,\n    return constants.VM_GEN_1","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f43b0f527f5ca86c76e6c7def0cb860795177966","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        vm \u003d self._lookup_vm_check(instance_name)"},{"line_number":326,"context_line":"        vm_settings \u003d self._get_vm_setting_data(vm)"},{"line_number":327,"context_line":"        vm_gen \u003d getattr(vm_settings, \u0027VirtualSystemSubType\u0027,"},{"line_number":328,"context_line":"                         self._VIRTUAL_SYSTEM_SUBTYPE_GEN1)"},{"line_number":329,"context_line":"        return int(vm_gen.split(\u0027:\u0027)[-1])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_9acbcf72","line":328,"in_reply_to":"7a016987_065f9a0f","updated":"2015-05-14 12:31:06.000000000","message":"Done","commit_id":"ec9cc1a4c74a17b0a7f80d32a597ae18f92fd637"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"832dd401201a493e8c75a8d95a0987eb58386298","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    _VIRTUAL_SYSTEM_SUBTYPE \u003d \u0027VirtualSystemSubType\u0027"},{"line_number":50,"context_line":"    _VIRTUAL_SYSTEM_TYPE_REALIZED \u003d \u0027Microsoft:Hyper-V:System:Realized\u0027"},{"line_number":51,"context_line":"    _VIRTUAL_SYSTEM_SUBTYPE_GEN1 \u003d \u0027Microsoft:Hyper-V:SubType:1\u0027"},{"line_number":52,"context_line":"    _VIRTUAL_SYSTEM_SUBTYPE_GEN2 \u003d \u0027Microsoft:Hyper-V:SubType:2\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    _SNAPSHOT_FULL \u003d 2"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a016987_0401876a","line":51,"updated":"2015-05-27 15:50:30.000000000","message":"this is no longer used.","commit_id":"7b897c36d19e144f5966d1c10779be3c92bf4746"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"cccd799d4ba2e4fd3a247116e21aaa2cbfde97cf","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    _VIRTUAL_SYSTEM_SUBTYPE \u003d \u0027VirtualSystemSubType\u0027"},{"line_number":50,"context_line":"    _VIRTUAL_SYSTEM_TYPE_REALIZED \u003d \u0027Microsoft:Hyper-V:System:Realized\u0027"},{"line_number":51,"context_line":"    _VIRTUAL_SYSTEM_SUBTYPE_GEN1 \u003d \u0027Microsoft:Hyper-V:SubType:1\u0027"},{"line_number":52,"context_line":"    _VIRTUAL_SYSTEM_SUBTYPE_GEN2 \u003d \u0027Microsoft:Hyper-V:SubType:2\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    _SNAPSHOT_FULL \u003d 2"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a016987_ff171552","line":51,"in_reply_to":"7a016987_0401876a","updated":"2015-05-27 16:04:36.000000000","message":"Done","commit_id":"7b897c36d19e144f5966d1c10779be3c92bf4746"}]}
