)]}'
{"nova/compute/utils.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"89c37c6adc6fe56817c0469214ecaa605d8ca1d9","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    \"\"\"Confirm that hw_rescue_* image properties are present."},{"line_number":522,"context_line":"    \"\"\""},{"line_number":523,"context_line":"    hw_rescue_props \u003d [\u0027hw_rescue_device\u0027, \u0027hw_rescue_bus\u0027]"},{"line_number":524,"context_line":"    return any(key in image_meta.properties for key in hw_rescue_props)"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"class EventReporter(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_9838473f","line":524,"updated":"2016-04-19 15:57:01.000000000","message":"image_meta will be an object not a dict, so \u0027key in image_meta.properties\u0027 should raise an exception.\n\nYou want todo  hasattr(image_meta.properties, key)","commit_id":"4c7a4ec0d230866b7d1ea7c10834fc0a223b3c40"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fa9d476dcffb65189ef396b1d7fd30da39063a92","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    \"\"\"Confirm that hw_rescue_* image properties are present."},{"line_number":522,"context_line":"    \"\"\""},{"line_number":523,"context_line":"    hw_rescue_props \u003d [\u0027hw_rescue_device\u0027, \u0027hw_rescue_bus\u0027]"},{"line_number":524,"context_line":"    return any(key in image_meta.properties for key in hw_rescue_props)"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"class EventReporter(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_6872474b","line":524,"in_reply_to":"1a122d0e_9838473f","updated":"2016-04-21 13:59:49.000000000","message":"The object supports __contains__ and provides the same semantics as SQLA. __contains__ returns True if the attribute is loaded. hasattr() will always return True because all fields are properties on the object, but it will also trigger a lazy-load in the process, which is not what you want of course.\n\nSo, using __contains__ is the right thing to do here.","commit_id":"4c7a4ec0d230866b7d1ea7c10834fc0a223b3c40"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"50044af50354e5c58ba67fb5eca08c4af85fb08d","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    \"\"\"Confirm that hw_rescue_* image properties are present."},{"line_number":522,"context_line":"    \"\"\""},{"line_number":523,"context_line":"    hw_rescue_props \u003d [\u0027hw_rescue_device\u0027, \u0027hw_rescue_bus\u0027]"},{"line_number":524,"context_line":"    return any(hasattr(image_meta.properties, key) for key in hw_rescue_props)"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"class EventReporter(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_cd61ed13","line":524,"updated":"2016-04-21 13:53:25.000000000","message":"You can\u0027t use hasattr here. You need to use __contains__. So:\n\n return any(key in image_meta.properties for key in hw_rescue_props)","commit_id":"c704fcf78537692eb24aad051d8c62ef060dfc7d"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d4425f18d9cf6c74ee1a14d594bc9704c6cb1c40","unresolved":false,"context_lines":[{"line_number":526,"context_line":"    hw_rescue_props \u003d [\u0027hw_rescue_device\u0027, \u0027hw_rescue_bus\u0027]"},{"line_number":527,"context_line":"    return any(key in image_meta.properties for key in hw_rescue_props)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"class EventReporter(object):"},{"line_number":531,"context_line":"    \"\"\"Context manager to report instance action events.\"\"\""},{"line_number":532,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_379c855c","line":529,"updated":"2016-06-08 09:46:27.000000000","message":"I think I\u0027d suggest having this in nova/virt/hardware.py instead, since its not really used by anything in the nova/compute heirarchy.","commit_id":"c3da1323bfcf03884067a0127ad5e7e11032b4fa"}],"nova/tests/unit/virt/libvirt/test_blockinfo.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"4986f38b1dce46cd2e11e7b625b8680db87e2fd8","unresolved":false,"context_lines":[{"line_number":262,"context_line":"                      image_meta, rescue\u003dTrue, block_device_info\u003dblock_info,"},{"line_number":263,"context_line":"                      rescue_image_meta\u003drescue_image_meta)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        self.assertEqual(expect, mapping)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def test_get_disk_mapping_stable_rescue_virtio_disk(self):"},{"line_number":268,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_625a02f4","line":265,"updated":"2016-06-29 12:45:34.000000000","message":"nit (and probably a matter of personal taste): I\u0027d personally return the mapping, rename the function appropriately, and put the assert explicitly in the calling test. Makes the test slightly clearer to read imho.\n\nDon\u0027t make this change unless you\u0027re really bored.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"334011c81cb3e0b95b499b46593bb639c1a68abb","unresolved":false,"context_lines":[{"line_number":15724,"context_line":"            mock.patch.object(compute_utils, \u0027is_volume_backed_instance\u0027,"},{"line_number":15725,"context_line":"                              return_value\u003dFalse),"},{"line_number":15726,"context_line":"            mock.patch.object(blockinfo, \u0027get_disk_info\u0027),"},{"line_number":15727,"context_line":"            mock.patch.object(self.drvr, \u0027_create_image\u0027),"},{"line_number":15728,"context_line":"            mock.patch.object(self.drvr, \u0027_get_guest_xml\u0027),"},{"line_number":15729,"context_line":"            mock.patch.object(self.drvr, \u0027_destroy\u0027),"},{"line_number":15730,"context_line":"            mock.patch.object(self.drvr, \u0027_create_domain\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_cb21514f","line":15727,"updated":"2016-06-29 13:26:32.000000000","message":"I don\u0027t like this, because it loses the purpose of the original test. The original tests which disks have been created, by asserting calls to cache(). By mocking _create_image we never exercise the code which would tell us if our disk data is correct.\n\nI\u0027ll send you a patch for this.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"4986f38b1dce46cd2e11e7b625b8680db87e2fd8","unresolved":false,"context_lines":[{"line_number":15879,"context_line":"                                                configdrive_path))]"},{"line_number":15880,"context_line":"        mock_make.assert_has_calls(expected_call)"},{"line_number":15881,"context_line":""},{"line_number":15882,"context_line":"        # cache() should habe been called on the 3 non-config disk backends"},{"line_number":15883,"context_line":"        for backend in (mock_backend.kernel, mock_backend.ramdisk,"},{"line_number":15884,"context_line":"                        mock_backend.root):"},{"line_number":15885,"context_line":"            self.assertTrue(backend.cache.called)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_62a16246","line":15882,"updated":"2016-06-29 12:45:34.000000000","message":"?","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2c1a5873a0e3ab042aca49374dc087536cc03cac","unresolved":false,"context_lines":[{"line_number":16331,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.utils.write_to_file\u0027, mock.Mock())"},{"line_number":16332,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver, \u0027_supports_direct_io\u0027,"},{"line_number":16333,"context_line":"                       mock.Mock(return_value\u003dTrue))"},{"line_number":16334,"context_line":"    def _test_rescue(self, instance, disks, image_meta, block_device_info\u003dNone,"},{"line_number":16335,"context_line":"                     orig_image_meta\u003dNone, exists\u003dNone):"},{"line_number":16336,"context_line":"        network_info \u003d _fake_network_info(self, 1)"},{"line_number":16337,"context_line":"        rescue_password \u003d \u0027fake_password\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"3aaa91ec_60b72121","line":16334,"updated":"2016-07-01 12:13:56.000000000","message":"You\u0027ve added block_device_info, but you don\u0027t seem to be using it yet.","commit_id":"e540d757c69e6cb407c56539c9723357990d3e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2c1a5873a0e3ab042aca49374dc087536cc03cac","unresolved":false,"context_lines":[{"line_number":16344,"context_line":"            mock.patch.object(compute_utils, \u0027is_volume_backed_instance\u0027,"},{"line_number":16345,"context_line":"                              return_value\u003dFalse),"},{"line_number":16346,"context_line":"            mock.patch.object(objects.ImageMeta, \u0027from_image_ref\u0027,"},{"line_number":16347,"context_line":"                              return_value\u003dorig_image_meta),"},{"line_number":16348,"context_line":"            mock_backend(disks\u003ddisks, exists\u003dexists)"},{"line_number":16349,"context_line":"        ) as (mock_create_domain, mock_is_volume_backed, mock_get_image,"},{"line_number":16350,"context_line":"              mock_ignored):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3aaa91ec_a030e99e","line":16347,"updated":"2016-07-01 12:13:56.000000000","message":"To guard against a mixup with rescue and original imageids, I\u0027d add an assertion that the image_ref we\u0027re fetching is instance.image_ref.","commit_id":"e540d757c69e6cb407c56539c9723357990d3e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2c1a5873a0e3ab042aca49374dc087536cc03cac","unresolved":false,"context_lines":[{"line_number":16427,"context_line":""},{"line_number":16428,"context_line":"        # Assert that kernel and ramdisk were both created as raw"},{"line_number":16429,"context_line":"        for disk in kernel_ramdisk:"},{"line_number":16430,"context_line":"            self.assertEqual(\u0027raw\u0027, disk.image_type)"},{"line_number":16431,"context_line":""},{"line_number":16432,"context_line":"        # Assert that the rescue disk was created as the default type"},{"line_number":16433,"context_line":"        self.assertEqual(\u0027default\u0027, disks[\u0027disk.rescue\u0027].image_type)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3aaa91ec_2579ab2f","line":16430,"updated":"2016-07-01 12:13:56.000000000","message":"We could probably do with a _test_rescue_assert_kernel_ramdisk() method for this and the xml test below, as it\u0027s now cut/paste in 3 functions. Or even move the assertions into _test_rescue, but my preference is for explicit assertions in the test itself.","commit_id":"e540d757c69e6cb407c56539c9723357990d3e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2c1a5873a0e3ab042aca49374dc087536cc03cac","unresolved":false,"context_lines":[{"line_number":16433,"context_line":"        self.assertEqual(\u0027default\u0027, disks[\u0027disk.rescue\u0027].image_type)"},{"line_number":16434,"context_line":""},{"line_number":16435,"context_line":"        # We expect the generated domain to contain disk and"},{"line_number":16436,"context_line":"        # disk.rescue in that order"},{"line_number":16437,"context_line":"        expected_domain_disk_paths \u003d map("},{"line_number":16438,"context_line":"            lambda name: disks[name].path, (\u0027disk\u0027, \u0027disk.local\u0027,"},{"line_number":16439,"context_line":"                                            \u0027disk.rescue\u0027))"}],"source_content_type":"text/x-python","patch_set":21,"id":"3aaa91ec_25924b57","line":16436,"updated":"2016-07-01 12:13:56.000000000","message":"Need to update this comment.","commit_id":"e540d757c69e6cb407c56539c9723357990d3e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2c1a5873a0e3ab042aca49374dc087536cc03cac","unresolved":false,"context_lines":[{"line_number":16435,"context_line":"        # We expect the generated domain to contain disk and"},{"line_number":16436,"context_line":"        # disk.rescue in that order"},{"line_number":16437,"context_line":"        expected_domain_disk_paths \u003d map("},{"line_number":16438,"context_line":"            lambda name: disks[name].path, (\u0027disk\u0027, \u0027disk.local\u0027,"},{"line_number":16439,"context_line":"                                            \u0027disk.rescue\u0027))"},{"line_number":16440,"context_line":"        domain_disk_paths \u003d doc.xpath(\u0027devices/disk/source/@file\u0027)"},{"line_number":16441,"context_line":"        self.assertEqual(expected_domain_disk_paths, domain_disk_paths)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3aaa91ec_05974f3a","line":16438,"updated":"2016-07-01 12:13:56.000000000","message":"disk.local means we\u0027re not passing a bdm for the ephemeral disk to something. Is that expected? IIRC this will become eph0 if you pass in block_device_info.","commit_id":"e540d757c69e6cb407c56539c9723357990d3e3a"}],"nova/tests/unit/virt/test_hardware.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"4986f38b1dce46cd2e11e7b625b8680db87e2fd8","unresolved":false,"context_lines":[{"line_number":2751,"context_line":"        image_meta_props \u003d objects.ImageMetaProps.from_dict("},{"line_number":2752,"context_line":"                                    {\u0027hw_disk_bus\u0027: \u0027ide\u0027})"},{"line_number":2753,"context_line":"        image_meta.properties \u003d image_meta_props"},{"line_number":2754,"context_line":"        self.assertFalse(hw.check_hw_rescue_props(image_meta))"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_1f955732","line":2754,"updated":"2016-06-29 12:45:34.000000000","message":"nit: should probably be 2 different tests.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"}],"nova/virt/libvirt/blockinfo.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                                         disk_bus, boot_index\u003d1)"},{"line_number":518,"context_line":"        mapping[\u0027disk.rescue\u0027] \u003d rescue_info"},{"line_number":519,"context_line":"        mapping[\u0027root\u0027] \u003d rescue_info"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        os_info \u003d get_next_disk_info(mapping,"},{"line_number":522,"context_line":"                                     disk_bus)"},{"line_number":523,"context_line":"        mapping[\u0027disk\u0027] \u003d os_info"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_f5819190","side":"PARENT","line":520,"updated":"2016-06-29 11:51:57.000000000","message":"nit: unrelated whitespace change.","commit_id":"7a1180383ddbb663cf161f6aa949d9837fc45a4e"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                                         disk_bus, boot_index\u003d1)"},{"line_number":518,"context_line":"        mapping[\u0027disk.rescue\u0027] \u003d rescue_info"},{"line_number":519,"context_line":"        mapping[\u0027root\u0027] \u003d rescue_info"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        os_info \u003d get_next_disk_info(mapping,"},{"line_number":522,"context_line":"                                     disk_bus)"},{"line_number":523,"context_line":"        mapping[\u0027disk\u0027] \u003d os_info"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_50898c25","side":"PARENT","line":520,"in_reply_to":"3aaa91ec_f5819190","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"7a1180383ddbb663cf161f6aa949d9837fc45a4e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        os_info \u003d get_next_disk_info(mapping,"},{"line_number":522,"context_line":"                                     disk_bus)"},{"line_number":523,"context_line":"        mapping[\u0027disk\u0027] \u003d os_info"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        return mapping"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"    pre_assigned_device_names \u003d \\"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_5547c576","side":"PARENT","line":524,"updated":"2016-06-29 11:51:57.000000000","message":"nit: unrelated whitespace change.","commit_id":"7a1180383ddbb663cf161f6aa949d9837fc45a4e"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        os_info \u003d get_next_disk_info(mapping,"},{"line_number":522,"context_line":"                                     disk_bus)"},{"line_number":523,"context_line":"        mapping[\u0027disk\u0027] \u003d os_info"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        return mapping"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"    pre_assigned_device_names \u003d \\"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_907f7416","side":"PARENT","line":524,"in_reply_to":"3aaa91ec_5547c576","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"7a1180383ddbb663cf161f6aa949d9837fc45a4e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    \"\"\"Fetch the rescue device type and ensure it is supported."},{"line_number":223,"context_line":"    \"\"\""},{"line_number":224,"context_line":"    rescue_device \u003d rescue_image_meta.properties.get(\"hw_rescue_device\","},{"line_number":225,"context_line":"                                                          \"disk\")"},{"line_number":226,"context_line":"    if rescue_device not in SUPPORTED_DEVICE_TYPES:"},{"line_number":227,"context_line":"        raise exception.UnsupportedHardware(device_type\u003drescue_device)"},{"line_number":228,"context_line":"    return rescue_device"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_d549f5b8","line":225,"updated":"2016-06-29 11:51:57.000000000","message":"nit: indentation","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    \"\"\"Fetch the rescue device type and ensure it is supported."},{"line_number":223,"context_line":"    \"\"\""},{"line_number":224,"context_line":"    rescue_device \u003d rescue_image_meta.properties.get(\"hw_rescue_device\","},{"line_number":225,"context_line":"                                                          \"disk\")"},{"line_number":226,"context_line":"    if rescue_device not in SUPPORTED_DEVICE_TYPES:"},{"line_number":227,"context_line":"        raise exception.UnsupportedHardware(device_type\u003drescue_device)"},{"line_number":228,"context_line":"    return rescue_device"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_b093905a","line":225,"in_reply_to":"3aaa91ec_d549f5b8","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":640,"context_line":"        rescue_bus \u003d get_rescue_bus_for_device_type(instance, virt_type,"},{"line_number":641,"context_line":"                                                    rescue_image_meta,"},{"line_number":642,"context_line":"                                                    rescue_device)"},{"line_number":643,"context_line":"        config_rescue \u003d get_next_disk_info(mapping, rescue_bus,"},{"line_number":644,"context_line":"                                           device_type\u003drescue_device)"},{"line_number":645,"context_line":"        mapping[\u0027disk.rescue\u0027] \u003d config_rescue"},{"line_number":646,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_b0c43792","line":643,"updated":"2016-06-29 11:51:57.000000000","message":"nit: config_rescue? Did you mean rescue_info?","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":640,"context_line":"        rescue_bus \u003d get_rescue_bus_for_device_type(instance, virt_type,"},{"line_number":641,"context_line":"                                                    rescue_image_meta,"},{"line_number":642,"context_line":"                                                    rescue_device)"},{"line_number":643,"context_line":"        config_rescue \u003d get_next_disk_info(mapping, rescue_bus,"},{"line_number":644,"context_line":"                                           device_type\u003drescue_device)"},{"line_number":645,"context_line":"        mapping[\u0027disk.rescue\u0027] \u003d config_rescue"},{"line_number":646,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_7084880a","line":643,"in_reply_to":"3aaa91ec_b0c43792","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"47b5b26d13ff88f534295493135d275262993b92","unresolved":false,"context_lines":[{"line_number":2516,"context_line":"            # Fallback to the legacy method and print a warning if attempted."},{"line_number":2517,"context_line":"            LOG.warning(_LW(\"Only unstable device legacy instance rescues are \""},{"line_number":2518,"context_line":"                        \"supported by virt_type %(virt_type)s.\") %"},{"line_number":2519,"context_line":"                        {\u0027virt_type\u0027: virt_type})"},{"line_number":2520,"context_line":""},{"line_number":2521,"context_line":"        if image_hw_rescue_props:"},{"line_number":2522,"context_line":"            LOG.info(_LI(\"Attempting a stable device rescue\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a68dd71_2427d0b7","line":2519,"range":{"start_line":2519,"start_character":47,"end_line":2519,"end_character":49},"updated":"2016-01-21 13:30:56.000000000","message":"These warnings are invisible to end users, so I generally take the view that we\u0027re better off raising an exception rather than silently ignoring the requested user image config property","commit_id":"64d5a0ea72a673c8b9a2a73e5a4aea46fe9bb15f"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"29d8bac8a4b37f6e1666a5dc47c7178b02f4904e","unresolved":false,"context_lines":[{"line_number":2537,"context_line":""},{"line_number":2538,"context_line":"        if rescue_image_meta is None:"},{"line_number":2539,"context_line":"            rescue_image_meta \u003d objects.ImageMeta.from_dict("},{"line_number":2540,"context_line":"                rescue_images[\u0027image_id\u0027])"},{"line_number":2541,"context_line":"            if rescue_image_meta is None:"},{"line_number":2542,"context_line":"                reason \u003d _(\"No rescue image provided\")"},{"line_number":2543,"context_line":"                raise exception.InstanceNotRescuable(instance_id\u003dinstance.uuid,"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_c2340bfd","line":2540,"updated":"2016-06-27 15:24:37.000000000","message":"As discussed on IRC, this doesn\u0027t look right. rescue_images[\u0027image_id\u0027] would be a uuid not a metadata dict, so I\u0027m assuming this also means it\u0027s not tested.","commit_id":"f6ae3495a262aaf8be9aa4927a39b9c9f0cc3871"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"1386d5377acf1da96501e8fa13686c108b812dab","unresolved":false,"context_lines":[{"line_number":2537,"context_line":""},{"line_number":2538,"context_line":"        if rescue_image_meta is None:"},{"line_number":2539,"context_line":"            rescue_image_meta \u003d objects.ImageMeta.from_dict("},{"line_number":2540,"context_line":"                rescue_images[\u0027image_id\u0027])"},{"line_number":2541,"context_line":"            if rescue_image_meta is None:"},{"line_number":2542,"context_line":"                reason \u003d _(\"No rescue image provided\")"},{"line_number":2543,"context_line":"                raise exception.InstanceNotRescuable(instance_id\u003dinstance.uuid,"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_60ddec13","line":2540,"in_reply_to":"3aaa91ec_c2340bfd","updated":"2016-06-29 08:11:49.000000000","message":"Yes apologies, this lookup isn\u0027t actually required here, the compute layer already ensures that image_meta is set to something useful for the rescue :\n\nnova/nova/compute/manager.py\nhttps://git.io/vobzy","commit_id":"f6ae3495a262aaf8be9aa4927a39b9c9f0cc3871"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":2572,"context_line":"                reason \u003d (_(\"Stable device rescue is not supported by\""},{"line_number":2573,"context_line":"                            \" virt_type %s\"), virt_type)"},{"line_number":2574,"context_line":"                raise exception.InstanceNotRescuable(instance_id\u003dinstance.uuid,"},{"line_number":2575,"context_line":"                                                     reason\u003dreason)"},{"line_number":2576,"context_line":"            # NOTE(lyarwood): A stable disk device rescue provides the original"},{"line_number":2577,"context_line":"            # disk mapping for the instance with the rescue device appened to"},{"line_number":2578,"context_line":"            # the end. As a result we need to provide both the original"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_15d37d60","line":2575,"updated":"2016-06-29 11:51:57.000000000","message":"It might be friendlier to fall back to unstable rescue. However, as the user had to explicitly set properties to get the new behaviour, this isn\u0027t a regression.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":2610,"context_line":"                                          admin_pass\u003drescue_password,"},{"line_number":2611,"context_line":"                                          network_info\u003dnetwork_info,"},{"line_number":2612,"context_line":"                                          suffix\u003d\u0027.rescue\u0027)"},{"line_number":2613,"context_line":""},{"line_number":2614,"context_line":"        self._create_image(context, instance, disk_info[\u0027mapping\u0027],"},{"line_number":2615,"context_line":"                           suffix\u003d\u0027.rescue\u0027, disk_images\u003drescue_images,"},{"line_number":2616,"context_line":"                           network_info\u003dnetwork_info,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_5a12540a","line":2613,"updated":"2016-06-29 11:51:57.000000000","message":"nit: we officially frown on this sort of thing.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":2610,"context_line":"                                          admin_pass\u003drescue_password,"},{"line_number":2611,"context_line":"                                          network_info\u003dnetwork_info,"},{"line_number":2612,"context_line":"                                          suffix\u003d\u0027.rescue\u0027)"},{"line_number":2613,"context_line":""},{"line_number":2614,"context_line":"        self._create_image(context, instance, disk_info[\u0027mapping\u0027],"},{"line_number":2615,"context_line":"                           suffix\u003d\u0027.rescue\u0027, disk_images\u003drescue_images,"},{"line_number":2616,"context_line":"                           network_info\u003dnetwork_info,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_227aba88","line":2613,"in_reply_to":"3aaa91ec_5a12540a","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":2616,"context_line":"                           network_info\u003dnetwork_info,"},{"line_number":2617,"context_line":"                           admin_pass\u003drescue_password)"},{"line_number":2618,"context_line":"        xml \u003d self._get_guest_xml(context, instance, network_info, disk_info,"},{"line_number":2619,"context_line":"                                  image_meta, rescue\u003drescue_images,"},{"line_number":2620,"context_line":"                                  block_device_info\u003dblock_device_info,"},{"line_number":2621,"context_line":"                                  write_to_disk\u003dTrue)"},{"line_number":2622,"context_line":"        self._destroy(instance)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_fa6ce09d","line":2619,"range":{"start_line":2619,"start_character":46,"end_line":2619,"end_character":66},"updated":"2016-06-29 11:51:57.000000000","message":"Fun fact: despite being documented to be a dict, it seems this value is only ever used as a boolean when passed to _get_guest_xml.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":2616,"context_line":"                           network_info\u003dnetwork_info,"},{"line_number":2617,"context_line":"                           admin_pass\u003drescue_password)"},{"line_number":2618,"context_line":"        xml \u003d self._get_guest_xml(context, instance, network_info, disk_info,"},{"line_number":2619,"context_line":"                                  image_meta, rescue\u003drescue_images,"},{"line_number":2620,"context_line":"                                  block_device_info\u003dblock_device_info,"},{"line_number":2621,"context_line":"                                  write_to_disk\u003dTrue)"},{"line_number":2622,"context_line":"        self._destroy(instance)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_90e494e0","line":2619,"range":{"start_line":2619,"start_character":46,"end_line":2619,"end_character":66},"in_reply_to":"3aaa91ec_fa6ce09d","updated":"2016-06-30 08:23:06.000000000","message":"Nice, another item for the cleanup queue.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":3048,"context_line":"        # is the rescue image and we are never booting from a volume. For"},{"line_number":3049,"context_line":"        # stable disk device rescues we still need to ensure the rescue device"},{"line_number":3050,"context_line":"        # image is cached ready for use during the rescue even if the instance"},{"line_number":3051,"context_line":"        # is booting from a volume."},{"line_number":3052,"context_line":"        if not booted_from_volume or \u0027disk.rescue\u0027 in disk_mapping:"},{"line_number":3053,"context_line":"            root_fname \u003d imagecache.get_cache_fname(disk_images[\u0027image_id\u0027])"},{"line_number":3054,"context_line":"            size \u003d instance.root_gb * units.Gi"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_5a5d3478","line":3051,"updated":"2016-06-29 11:51:57.000000000","message":"nit: Nice comment. I\u0027d prefer \u0027created\u0027 over \u0027cached\u0027, because the effect of cache() is to create a disk. It may or may not cache it. Go figure. Don\u0027t update for this: I\u0027ll end up fixing it up in my series anyway.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":3048,"context_line":"        # is the rescue image and we are never booting from a volume. For"},{"line_number":3049,"context_line":"        # stable disk device rescues we still need to ensure the rescue device"},{"line_number":3050,"context_line":"        # image is cached ready for use during the rescue even if the instance"},{"line_number":3051,"context_line":"        # is booting from a volume."},{"line_number":3052,"context_line":"        if not booted_from_volume or \u0027disk.rescue\u0027 in disk_mapping:"},{"line_number":3053,"context_line":"            root_fname \u003d imagecache.get_cache_fname(disk_images[\u0027image_id\u0027])"},{"line_number":3054,"context_line":"            size \u003d instance.root_gb * units.Gi"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_50050c78","line":3051,"in_reply_to":"3aaa91ec_5a5d3478","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":3049,"context_line":"        # stable disk device rescues we still need to ensure the rescue device"},{"line_number":3050,"context_line":"        # image is cached ready for use during the rescue even if the instance"},{"line_number":3051,"context_line":"        # is booting from a volume."},{"line_number":3052,"context_line":"        if not booted_from_volume or \u0027disk.rescue\u0027 in disk_mapping:"},{"line_number":3053,"context_line":"            root_fname \u003d imagecache.get_cache_fname(disk_images[\u0027image_id\u0027])"},{"line_number":3054,"context_line":"            size \u003d instance.root_gb * units.Gi"},{"line_number":3055,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_ba0c1843","line":3052,"updated":"2016-06-29 11:51:57.000000000","message":"Fun fact: the image cache manager won\u0027t consider this image as in use unless it\u0027s also being used as the root image of some instance. That means that it\u0027s liable to be deleted, which is likely problematic for rescued instances using qcow2.\n\nHowever, this is also the case currently, so this isn\u0027t an issue specific to this patch.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":3049,"context_line":"        # stable disk device rescues we still need to ensure the rescue device"},{"line_number":3050,"context_line":"        # image is cached ready for use during the rescue even if the instance"},{"line_number":3051,"context_line":"        # is booting from a volume."},{"line_number":3052,"context_line":"        if not booted_from_volume or \u0027disk.rescue\u0027 in disk_mapping:"},{"line_number":3053,"context_line":"            root_fname \u003d imagecache.get_cache_fname(disk_images[\u0027image_id\u0027])"},{"line_number":3054,"context_line":"            size \u003d instance.root_gb * units.Gi"},{"line_number":3055,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_72ad8283","line":3052,"in_reply_to":"3aaa91ec_ba0c1843","updated":"2016-06-30 08:23:06.000000000","message":"Nice, that\u0027s going to be a problem for stable rescues where disk.rescue isn\u0027t the root. Should we document this in a bug?","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":3488,"context_line":"                                                     \u0027disk\u0027,"},{"line_number":3489,"context_line":"                                                     disk_mapping,"},{"line_number":3490,"context_line":"                                                     inst_type)"},{"line_number":3491,"context_line":"                devices.append(diskos)"},{"line_number":3492,"context_line":"            else:"},{"line_number":3493,"context_line":"                if \u0027disk\u0027 in disk_mapping:"},{"line_number":3494,"context_line":"                    diskos \u003d self._get_guest_disk_config(instance,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_10154b9a","line":3491,"updated":"2016-06-29 11:51:57.000000000","message":"NOTE: legacy code doesn\u0027t add the rescue config disk either.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":3488,"context_line":"                                                     \u0027disk\u0027,"},{"line_number":3489,"context_line":"                                                     disk_mapping,"},{"line_number":3490,"context_line":"                                                     inst_type)"},{"line_number":3491,"context_line":"                devices.append(diskos)"},{"line_number":3492,"context_line":"            else:"},{"line_number":3493,"context_line":"                if \u0027disk\u0027 in disk_mapping:"},{"line_number":3494,"context_line":"                    diskos \u003d self._get_guest_disk_config(instance,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_d2d556e5","line":3491,"in_reply_to":"3aaa91ec_10154b9a","updated":"2016-06-30 08:23:06.000000000","message":"I\u0027m going to document this in a bug and submit a review to correct this outside of the stable rescue series today.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"9ef2a17dcb428680280f38c6ea0dc4f78c4c99f6","unresolved":false,"context_lines":[{"line_number":3530,"context_line":"                                                             disk_mapping,"},{"line_number":3531,"context_line":"                                                             inst_type,"},{"line_number":3532,"context_line":"                                                             boot_order\u003d\u00271\u0027)"},{"line_number":3533,"context_line":"                    devices.append(diskrescue)"},{"line_number":3534,"context_line":""},{"line_number":3535,"context_line":"            if \u0027disk.config\u0027 in disk_mapping:"},{"line_number":3536,"context_line":"                diskconfig \u003d self._get_guest_disk_config("}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_102eebf9","line":3533,"updated":"2016-06-29 11:51:57.000000000","message":"What about the rescue config disk? Remember this will be different to the regular config disk.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":3530,"context_line":"                                                             disk_mapping,"},{"line_number":3531,"context_line":"                                                             inst_type,"},{"line_number":3532,"context_line":"                                                             boot_order\u003d\u00271\u0027)"},{"line_number":3533,"context_line":"                    devices.append(diskrescue)"},{"line_number":3534,"context_line":""},{"line_number":3535,"context_line":"            if \u0027disk.config\u0027 in disk_mapping:"},{"line_number":3536,"context_line":"                diskconfig \u003d self._get_guest_disk_config("}],"source_content_type":"text/x-python","patch_set":18,"id":"3aaa91ec_120a3e8a","line":3533,"in_reply_to":"3aaa91ec_102eebf9","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"7e5ba0b4900e1e1fa22f185338937de142b89dba","unresolved":false,"context_lines":[{"line_number":2598,"context_line":"        if hardware.check_hw_rescue_props(image_meta):"},{"line_number":2599,"context_line":"            LOG.info(_LI(\"Attempting a stable device rescue.\"),"},{"line_number":2600,"context_line":"                     instance_uuid\u003dinstance.uuid)"},{"line_number":2601,"context_line":"            if virt_type in (\u0027lxc\u0027, \u0027xen\u0027):"},{"line_number":2602,"context_line":"                reason \u003d (_(\"Stable device rescue is not supported by\""},{"line_number":2603,"context_line":"                            \" virt_type %s\"), virt_type)"},{"line_number":2604,"context_line":"                raise exception.InstanceNotRescuable(instance_id\u003dinstance.uuid,"},{"line_number":2605,"context_line":"                                                     reason\u003dreason)"},{"line_number":2606,"context_line":"            # NOTE(lyarwood): A stable disk device rescue provides the original"},{"line_number":2607,"context_line":"            # disk mapping for the instance with the rescue device appened to"},{"line_number":2608,"context_line":"            # the end. As a result we need to provide both the original"}],"source_content_type":"text/x-python","patch_set":20,"id":"3aaa91ec_40430542","line":2605,"range":{"start_line":2601,"start_character":0,"end_line":2605,"end_character":67},"updated":"2016-07-01 12:11:33.000000000","message":"This shouldn\u0027t be here given the capabilities check in the compute layer, we should be able to set supports_stable_rescue dependant on the virt_type elsewhere.","commit_id":"8b1c3fb8de6354d0097f61665a77ed0eed96f0e8"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"7e5ba0b4900e1e1fa22f185338937de142b89dba","unresolved":false,"context_lines":[{"line_number":2613,"context_line":"                image_meta \u003d objects.ImageMeta.from_image_ref(context,"},{"line_number":2614,"context_line":"                                        self._image_api, instance.image_ref)"},{"line_number":2615,"context_line":"            else:"},{"line_number":2616,"context_line":"                image_meta \u003d None"},{"line_number":2617,"context_line":""},{"line_number":2618,"context_line":"        else:"},{"line_number":2619,"context_line":"            LOG.info(_LI(\"Attempting an unstable device rescue\"),"}],"source_content_type":"text/x-python","patch_set":20,"id":"3aaa91ec_e0a5d102","line":2616,"updated":"2016-07-01 12:11:33.000000000","message":"Can we ever hit this? An instance booting from a blank volume that we then rescue without providing a rescue image?","commit_id":"8b1c3fb8de6354d0097f61665a77ed0eed96f0e8"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"7e5ba0b4900e1e1fa22f185338937de142b89dba","unresolved":false,"context_lines":[{"line_number":2618,"context_line":"        else:"},{"line_number":2619,"context_line":"            LOG.info(_LI(\"Attempting an unstable device rescue\"),"},{"line_number":2620,"context_line":"                         instance_uuid\u003dinstance.uuid)"},{"line_number":2621,"context_line":"            if compute_utils.is_volume_backed_instance(context, instance):"},{"line_number":2622,"context_line":"                reason \u003d _(\"Cannot rescue a volume backed instance\")"},{"line_number":2623,"context_line":"                raise exception.InstanceNotRescuable(instance_id\u003dinstance.uuid,"},{"line_number":2624,"context_line":"                                                     reason\u003dreason)"},{"line_number":2625,"context_line":"            # NOTE(lyarwood): An unstable rescue only provides the rescue"},{"line_number":2626,"context_line":"            # device and the original root device so we only provide image_meta"},{"line_number":2627,"context_line":"            rescue_image_meta \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"3aaa91ec_409825c0","line":2624,"range":{"start_line":2621,"start_character":0,"end_line":2624,"end_character":67},"updated":"2016-07-01 12:11:33.000000000","message":"I\u0027ll also move this check up into the compute layer.","commit_id":"8b1c3fb8de6354d0097f61665a77ed0eed96f0e8"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"54d66e6187e87befe27eeb5980788d3e6be531c9","unresolved":false,"context_lines":[{"line_number":3115,"context_line":"        # NOTE(lyarwood): Avoid recreating any ephemeral or swap disks with the"},{"line_number":3116,"context_line":"        # rescue prefix. We do not need these for an unstable rescue and they"},{"line_number":3117,"context_line":"        # should already exist for use in a stable rescue."},{"line_number":3118,"context_line":"        if \u0027disk.rescue\u0027 not in disk_mapping:"},{"line_number":3119,"context_line":"            # Lookup the filesystem type if required"},{"line_number":3120,"context_line":"            os_type_with_default \u003d disk.get_fs_type_for_os_type("},{"line_number":3121,"context_line":"                instance.os_type)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3aaa91ec_6098c175","line":3118,"updated":"2016-07-01 12:17:06.000000000","message":"This is ugly, but I think it\u0027s the right approach for this patch. I\u0027ll look to clean this up in the storage series.","commit_id":"e540d757c69e6cb407c56539c9723357990d3e3a"}],"releasenotes/notes/libvirt-stable-disk-device-rescue-1dc3fb9e2c285aed.yaml":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"eb75631d128d4940cc3223dfac71ec78d97a14d5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The Libvirt driver now allows tenant users to rescue instances while"},{"line_number":4,"context_line":"    keeping all original disk devices attached. Two new image properties have"},{"line_number":5,"context_line":"    been added to both enable such behaviour and allow tenant users to further"},{"line_number":6,"context_line":"    control the device type and device bus used to present the rescue image to"},{"line_number":7,"context_line":"    the instance. The absence of these image properties against the rescue"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"3aaa91ec_9fadc7eb","line":4,"updated":"2016-06-29 12:17:30.000000000","message":"Might be nice to say what they are.","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"07b20b860bf436346887661e50819a7070e5becc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The Libvirt driver now allows tenant users to rescue instances while"},{"line_number":4,"context_line":"    keeping all original disk devices attached. Two new image properties have"},{"line_number":5,"context_line":"    been added to both enable such behaviour and allow tenant users to further"},{"line_number":6,"context_line":"    control the device type and device bus used to present the rescue image to"},{"line_number":7,"context_line":"    the instance. The absence of these image properties against the rescue"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"3aaa91ec_b2f9aa82","line":4,"in_reply_to":"3aaa91ec_9fadc7eb","updated":"2016-06-30 08:23:06.000000000","message":"Done","commit_id":"bbdd2ca66a4fa386d0e600989d541c68107a9d51"}]}
