)]}'
{"nova/compute/manager.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"b331407b2383bd5b36573ef41993a8b7cc2ce1cc","unresolved":false,"context_lines":[{"line_number":5016,"context_line":"        \"\"\""},{"line_number":5017,"context_line":"        is_volume_backed \u003d self.compute_api.is_volume_backed_instance(ctxt,"},{"line_number":5018,"context_line":"                                                                      instance)"},{"line_number":5019,"context_line":"        got_migrate_data_object \u003d isinstance(dest_check_data,"},{"line_number":5020,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5021,"context_line":"        if not got_migrate_data_object:"},{"line_number":5022,"context_line":"            dest_check_data \u003d \\"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_b3284c98","line":5019,"updated":"2015-12-14 11:31:17.000000000","message":"Can\u0027t we add something like:\n# NOTE(danms): Remove these guards in v5.0 of the RPC API","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2dfce133e9e3da5362651d8ce810bdd0f3f4938","unresolved":false,"context_lines":[{"line_number":5016,"context_line":"        \"\"\""},{"line_number":5017,"context_line":"        is_volume_backed \u003d self.compute_api.is_volume_backed_instance(ctxt,"},{"line_number":5018,"context_line":"                                                                      instance)"},{"line_number":5019,"context_line":"        got_migrate_data_object \u003d isinstance(dest_check_data,"},{"line_number":5020,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5021,"context_line":"        if not got_migrate_data_object:"},{"line_number":5022,"context_line":"            dest_check_data \u003d \\"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_a3130c00","line":5019,"in_reply_to":"7a740942_b3284c98","updated":"2015-12-14 15:16:53.000000000","message":"Yep.","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"688f1db311dd1763b72dc40076d5b35eecc0e6fd","unresolved":false,"context_lines":[{"line_number":5094,"context_line":"    def _get_migrate_data_obj(self):"},{"line_number":5095,"context_line":"        # FIXME(danms): A couple patches from now, we\u0027ll be able to"},{"line_number":5096,"context_line":"        # avoid this failure _if_ we get a new-style call with the"},{"line_number":5097,"context_line":"        # object."},{"line_number":5098,"context_line":"        if CONF.compute_driver.startswith(\u0027libvirt\u0027):"},{"line_number":5099,"context_line":"            return objects.LibvirtLiveMigrateData()"},{"line_number":5100,"context_line":"        elif CONF.compute_driver.startswith(\u0027xenapi\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_b9eb4da3","line":5097,"updated":"2015-12-14 11:32:39.000000000","message":"were we not going to remove this here? I guess that is later?","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2dfce133e9e3da5362651d8ce810bdd0f3f4938","unresolved":false,"context_lines":[{"line_number":5094,"context_line":"    def _get_migrate_data_obj(self):"},{"line_number":5095,"context_line":"        # FIXME(danms): A couple patches from now, we\u0027ll be able to"},{"line_number":5096,"context_line":"        # avoid this failure _if_ we get a new-style call with the"},{"line_number":5097,"context_line":"        # object."},{"line_number":5098,"context_line":"        if CONF.compute_driver.startswith(\u0027libvirt\u0027):"},{"line_number":5099,"context_line":"            return objects.LibvirtLiveMigrateData()"},{"line_number":5100,"context_line":"        elif CONF.compute_driver.startswith(\u0027xenapi\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_c3973846","line":5097,"in_reply_to":"7a740942_b9eb4da3","updated":"2015-12-14 15:16:53.000000000","message":"Well, it might need to change to a NOTE, because we really need to continue to handle this gracefully in case someone is either developing migration support for their driver, or if there is an out-of-tree driver. Better to handle it than crash I think.","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"b331407b2383bd5b36573ef41993a8b7cc2ce1cc","unresolved":false,"context_lines":[{"line_number":5187,"context_line":"        # NOTE(danms): Remove these guards in v5.0 of the RPC API"},{"line_number":5188,"context_line":"        if migration:"},{"line_number":5189,"context_line":"            migration.status \u003d \u0027queued\u0027"},{"line_number":5190,"context_line":"            migration.save()"},{"line_number":5191,"context_line":""},{"line_number":5192,"context_line":"        def dispatch_live_migration(*args, **kwargs):"},{"line_number":5193,"context_line":"            with self._live_migration_semaphore:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_3313fc66","line":5190,"updated":"2015-12-14 11:31:17.000000000","message":"is it neater to call detect_implementation here?","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2dfce133e9e3da5362651d8ce810bdd0f3f4938","unresolved":false,"context_lines":[{"line_number":5187,"context_line":"        # NOTE(danms): Remove these guards in v5.0 of the RPC API"},{"line_number":5188,"context_line":"        if migration:"},{"line_number":5189,"context_line":"            migration.status \u003d \u0027queued\u0027"},{"line_number":5190,"context_line":"            migration.save()"},{"line_number":5191,"context_line":""},{"line_number":5192,"context_line":"        def dispatch_live_migration(*args, **kwargs):"},{"line_number":5193,"context_line":"            with self._live_migration_semaphore:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_e33cb430","line":5190,"in_reply_to":"7a740942_3313fc66","updated":"2015-12-14 15:16:53.000000000","message":"Hmm? detect_implementation is for the MigrateData object, this code is changing the status on the Migration object, which aren\u0027t related.","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a087517778ab6740cbe1fef42e876d11b4f318df","unresolved":false,"context_lines":[{"line_number":5520,"context_line":"        if do_cleanup:"},{"line_number":5521,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":5522,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"},{"line_number":5523,"context_line":"                    migrate_data\u003dmigrate_data)"},{"line_number":5524,"context_line":""},{"line_number":5525,"context_line":"        self._notify_about_instance_usage(context, instance,"},{"line_number":5526,"context_line":"                                          \"live_migration._rollback.end\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_843553db","line":5523,"range":{"start_line":5523,"start_character":20,"end_line":5523,"end_character":45},"updated":"2016-01-13 05:06:58.000000000","message":"If the source node is old node, the migrate_data at here will be a dict. And at same time, the destination node is new node, at new node it should convert dict back to object. We probably need to do that at line after line 5539","commit_id":"50b09b82da135aac51a0103a191e2b60d847d48a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"baa7656b661af6fba3f3ac023ade48d096bab6be","unresolved":false,"context_lines":[{"line_number":5520,"context_line":"        if do_cleanup:"},{"line_number":5521,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":5522,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"},{"line_number":5523,"context_line":"                    migrate_data\u003dmigrate_data)"},{"line_number":5524,"context_line":""},{"line_number":5525,"context_line":"        self._notify_about_instance_usage(context, instance,"},{"line_number":5526,"context_line":"                                          \"live_migration._rollback.end\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_ec02da0a","line":5523,"range":{"start_line":5523,"start_character":20,"end_line":5523,"end_character":45},"in_reply_to":"da6ed579_843553db","updated":"2016-01-13 15:13:49.000000000","message":"No, migrate_data should always be an object here because of L5495 so I think this is okay.","commit_id":"50b09b82da135aac51a0103a191e2b60d847d48a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a087517778ab6740cbe1fef42e876d11b4f318df","unresolved":false,"context_lines":[{"line_number":5536,"context_line":""},{"line_number":5537,"context_line":"        :param context: security context"},{"line_number":5538,"context_line":"        :param instance: a nova.objects.instance.Instance object sent over rpc"},{"line_number":5539,"context_line":"        \"\"\""},{"line_number":5540,"context_line":"        network_info \u003d self.network_api.get_instance_nw_info(context, instance)"},{"line_number":5541,"context_line":"        self._notify_about_instance_usage("},{"line_number":5542,"context_line":"                      context, instance, \"live_migration.rollback.dest.start\","}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_c4426b3e","line":5539,"updated":"2016-01-13 05:06:58.000000000","message":"If migrate_data is dict, we should convert it to object.","commit_id":"50b09b82da135aac51a0103a191e2b60d847d48a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"baa7656b661af6fba3f3ac023ade48d096bab6be","unresolved":false,"context_lines":[{"line_number":5536,"context_line":""},{"line_number":5537,"context_line":"        :param context: security context"},{"line_number":5538,"context_line":"        :param instance: a nova.objects.instance.Instance object sent over rpc"},{"line_number":5539,"context_line":"        \"\"\""},{"line_number":5540,"context_line":"        network_info \u003d self.network_api.get_instance_nw_info(context, instance)"},{"line_number":5541,"context_line":"        self._notify_about_instance_usage("},{"line_number":5542,"context_line":"                      context, instance, \"live_migration.rollback.dest.start\","}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_efee4cb3","line":5539,"in_reply_to":"da6ed579_c4426b3e","updated":"2016-01-13 15:13:49.000000000","message":"Yep, good catch (again).","commit_id":"50b09b82da135aac51a0103a191e2b60d847d48a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"549334ca86f1dd9caa122cedc080c52327cdae09","unresolved":false,"context_lines":[{"line_number":5036,"context_line":"            self._get_compute_info(ctxt, instance.host))"},{"line_number":5037,"context_line":"        dst_compute_info \u003d obj_base.obj_to_primitive("},{"line_number":5038,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":5039,"context_line":"        dest_check_data \u003d self.driver.check_can_live_migrate_destination(ctxt,"},{"line_number":5040,"context_line":"            instance, src_compute_info, dst_compute_info,"},{"line_number":5041,"context_line":"            block_migration, disk_over_commit)"},{"line_number":5042,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027 % dest_check_data)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_98074118","line":5039,"range":{"start_line":5039,"start_character":26,"end_line":5039,"end_character":72},"updated":"2016-01-15 21:34:33.000000000","message":"It looks like this is always returning an object now that we\u0027ll pass to compute_rpcapi.check_can_live_migrate_source, but we apparently never updated the docstring for that in the ComputeDriver and some of the virt drivers, so I had to go check:\n\nhttps://github.com/openstack/nova/blob/aaaba4a12eee10ae496e7e372777bfff217db401/nova/virt/driver.py#L950\n\nWe could clean that up here or in a separate change.","commit_id":"bb19739998690a98c0377025e2cce3ecce9bc7e6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"549334ca86f1dd9caa122cedc080c52327cdae09","unresolved":false,"context_lines":[{"line_number":5039,"context_line":"        dest_check_data \u003d self.driver.check_can_live_migrate_destination(ctxt,"},{"line_number":5040,"context_line":"            instance, src_compute_info, dst_compute_info,"},{"line_number":5041,"context_line":"            block_migration, disk_over_commit)"},{"line_number":5042,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027 % dest_check_data)"},{"line_number":5043,"context_line":"        try:"},{"line_number":5044,"context_line":"            migrate_data \u003d self.compute_rpcapi.\\"},{"line_number":5045,"context_line":"                                check_can_live_migrate_source(ctxt, instance,"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_3819757a","line":5042,"range":{"start_line":5042,"start_character":49,"end_line":5042,"end_character":50},"updated":"2016-01-15 21:34:33.000000000","message":"use a comma","commit_id":"bb19739998690a98c0377025e2cce3ecce9bc7e6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5053,"context_line":"        finally:"},{"line_number":5054,"context_line":"            self.driver.check_can_live_migrate_destination_cleanup(ctxt,"},{"line_number":5055,"context_line":"                    dest_check_data)"},{"line_number":5056,"context_line":"        if \u0027migrate_data\u0027 in dest_check_data:"},{"line_number":5057,"context_line":"            migrate_data.update(dest_check_data[\u0027migrate_data\u0027])"},{"line_number":5058,"context_line":"        return migrate_data"},{"line_number":5059,"context_line":""},{"line_number":5060,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_fd78ab91","side":"PARENT","line":5057,"range":{"start_line":5056,"start_character":8,"end_line":5057,"end_character":64},"updated":"2016-01-18 19:23:13.000000000","message":"So this is removed because we assume migrate_data is an object now, I\u0027m just wondering if we lose anything here. I checked the libvirt and xenapi driver methods for check_can_live_migrate_destination_cleanup and they don\u0027t change dest_check_data at all, so those wouldn\u0027t be a problem.","commit_id":"49c05a243018b64e3ba0c30e39515e541b610669"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5072,"context_line":"        got_migrate_data_object \u003d isinstance(dest_check_data,"},{"line_number":5073,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5074,"context_line":"        if not got_migrate_data_object:"},{"line_number":5075,"context_line":"            dest_check_data \u003d \\"},{"line_number":5076,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5077,"context_line":"                    dest_check_data)"},{"line_number":5078,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_7d483b2e","line":5075,"range":{"start_line":5075,"start_character":12,"end_line":5075,"end_character":27},"updated":"2016-01-18 19:23:13.000000000","message":"This starts passing an object down to the virt driver\u0027s check_can_live_migrate_source method rather than a dict, which is ok since we handle it in:\n\n1. xenapi: https://github.com/openstack/nova/blob/master/nova/virt/xenapi/vmops.py#L2193\n\n2. libvirt: https://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L5315\n\nWith this change, couldn\u0027t you remove those isinstance checks in the virt drivers?","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e05d3a3a2a1e3803fe2812899564ab1ac972dcb6","unresolved":false,"context_lines":[{"line_number":5072,"context_line":"        got_migrate_data_object \u003d isinstance(dest_check_data,"},{"line_number":5073,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5074,"context_line":"        if not got_migrate_data_object:"},{"line_number":5075,"context_line":"            dest_check_data \u003d \\"},{"line_number":5076,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5077,"context_line":"                    dest_check_data)"},{"line_number":5078,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_a10d32ea","line":5075,"range":{"start_line":5075,"start_character":12,"end_line":5075,"end_character":27},"in_reply_to":"ba63e191_7d483b2e","updated":"2016-01-26 10:34:48.000000000","message":"Yeah, but I was thinking about doing that in a later patch to isolate the testing of it. However, I can do that and see if there is a large impact and squash here if not.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5073,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5074,"context_line":"        if not got_migrate_data_object:"},{"line_number":5075,"context_line":"            dest_check_data \u003d \\"},{"line_number":5076,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5077,"context_line":"                    dest_check_data)"},{"line_number":5078,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"},{"line_number":5079,"context_line":"        block_device_info \u003d self._get_instance_block_device_info("}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_5d95373e","line":5076,"range":{"start_line":5076,"start_character":49,"end_line":5076,"end_character":70},"updated":"2016-01-18 19:23:13.000000000","message":"Let\u0027s assume this is for libvirt, the detect_implementation method keys off the instance_relative_path attribute, which is set in check_can_live_migrate_source:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L5372\n\nSo don\u0027t we have a bit of a chicken-and-egg issue? Or is it fine because detect_implementation will just give us the base migrate data object class and we start populating that? Still...we already have a check in the virt driver code and that uses the specific type:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L5315\n\nWhich seems safer.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ad5505f873c781df99a9b7e60385dd5ca1a067f4","unresolved":false,"context_lines":[{"line_number":5073,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5074,"context_line":"        if not got_migrate_data_object:"},{"line_number":5075,"context_line":"            dest_check_data \u003d \\"},{"line_number":5076,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5077,"context_line":"                    dest_check_data)"},{"line_number":5078,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"},{"line_number":5079,"context_line":"        block_device_info \u003d self._get_instance_block_device_info("}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_563bc39c","line":5076,"range":{"start_line":5076,"start_character":49,"end_line":5076,"end_character":70},"in_reply_to":"9a68dd71_0916a0a7","updated":"2016-01-26 15:30:25.000000000","message":"Not sure, I made a comment in the detect method (I think) that it would be nicer to put a type in the legacy dict so we could key off that, but that would have to be in liberty I guess for it to be reliable, which isn\u0027t helpful.\n\nSo this method is called from _do_check_can_live_migrate_destination which could be on a liberty node, right? In which case it wouldn\u0027t be an object (unless the compute RPC API converts it before it gets here?). In which case this method would detect that and create a base LiveMigrateData object and then passes that to the virt driver.\n\nAnd if that\u0027s the case, then this is what worries me:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L5365\n\nBecause that would not be True and then we wouldn\u0027t have a LibvirtLiveMigrateData object and then this will fail because it\u0027s not an attribute on the base class:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L5422\n\nWe probably don\u0027t hit this in the test jobs because we don\u0027t live migrate from a mitaka to liberty node?\n\nAlso, according to the compute rpcapi method, if we were sending this from mitaka to liberty, we couldn\u0027t send version 4.7 so we\u0027d be sending a dict to the liberty node, so yeah, I think this could be a problem...","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"682180e885e2241f4625b1867ac562e84d2250b6","unresolved":false,"context_lines":[{"line_number":5073,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5074,"context_line":"        if not got_migrate_data_object:"},{"line_number":5075,"context_line":"            dest_check_data \u003d \\"},{"line_number":5076,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5077,"context_line":"                    dest_check_data)"},{"line_number":5078,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"},{"line_number":5079,"context_line":"        block_device_info \u003d self._get_instance_block_device_info("}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_0916a0a7","line":5076,"range":{"start_line":5076,"start_character":49,"end_line":5076,"end_character":70},"in_reply_to":"9a68dd71_e186ca15","updated":"2016-01-26 10:56:46.000000000","message":"Looking at this further, I\u0027m not entirely sure about this TBH. I think maybe if I just add another key to the detection that looks for a thing that is returned from check_can_live_migrate_destination() then I\u0027m okay right?","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e05d3a3a2a1e3803fe2812899564ab1ac972dcb6","unresolved":false,"context_lines":[{"line_number":5073,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5074,"context_line":"        if not got_migrate_data_object:"},{"line_number":5075,"context_line":"            dest_check_data \u003d \\"},{"line_number":5076,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5077,"context_line":"                    dest_check_data)"},{"line_number":5078,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"},{"line_number":5079,"context_line":"        block_device_info \u003d self._get_instance_block_device_info("}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_e186ca15","line":5076,"range":{"start_line":5076,"start_character":49,"end_line":5076,"end_character":70},"in_reply_to":"ba63e191_5d95373e","updated":"2016-01-26 10:34:48.000000000","message":"Yeah, we shouldn\u0027t hit this unless something goes wrong. So we\u0027ll get a base object which will avoid KeyErrors and then hit the proper check or a real AttributeError later. But again, this shouldn\u0027t happen, unless I\u0027m missing something.\n\nAnd, this is only for liberty computes talking to mitaka ones of course, so this is very limited in terms of where it will apply.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5083,"context_line":"                                                           block_device_info)"},{"line_number":5084,"context_line":"        if not got_migrate_data_object:"},{"line_number":5085,"context_line":"            result \u003d result.to_legacy_dict()"},{"line_number":5086,"context_line":"        LOG.debug(\u0027source check data is %s\u0027 % result)"},{"line_number":5087,"context_line":"        return result"},{"line_number":5088,"context_line":""},{"line_number":5089,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_fd866b64","line":5086,"range":{"start_line":5086,"start_character":44,"end_line":5086,"end_character":45},"updated":"2016-01-18 19:23:13.000000000","message":"Use a comma instead of %.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5101,"context_line":"                             storage."},{"line_number":5102,"context_line":""},{"line_number":5103,"context_line":"        \"\"\""},{"line_number":5104,"context_line":"        LOG.debug(\u0027pre_live_migration data is %s\u0027 % migrate_data)"},{"line_number":5105,"context_line":"        got_migrate_data_object \u003d isinstance(migrate_data,"},{"line_number":5106,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5107,"context_line":"        if not got_migrate_data_object:"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_dd5da7ed","line":5104,"range":{"start_line":5104,"start_character":50,"end_line":5104,"end_character":51},"updated":"2016-01-18 19:23:13.000000000","message":"use a comma","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5148,"context_line":"        LOG.debug(\u0027pre_live_migration result data is %s\u0027 % migrate_data)"},{"line_number":5149,"context_line":"        return migrate_data"},{"line_number":5150,"context_line":""},{"line_number":5151,"context_line":"    def _get_migrate_data_obj(self):"},{"line_number":5152,"context_line":"        # FIXME(danms): A couple patches from now, we\u0027ll be able to"},{"line_number":5153,"context_line":"        # avoid this failure _if_ we get a new-style call with the"},{"line_number":5154,"context_line":"        # object."}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_fd674b23","line":5151,"range":{"start_line":5151,"start_character":8,"end_line":5151,"end_character":29},"updated":"2016-01-18 19:23:13.000000000","message":"This is no longer used right? Let\u0027s remove it if so.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e05d3a3a2a1e3803fe2812899564ab1ac972dcb6","unresolved":false,"context_lines":[{"line_number":5148,"context_line":"        LOG.debug(\u0027pre_live_migration result data is %s\u0027 % migrate_data)"},{"line_number":5149,"context_line":"        return migrate_data"},{"line_number":5150,"context_line":""},{"line_number":5151,"context_line":"    def _get_migrate_data_obj(self):"},{"line_number":5152,"context_line":"        # FIXME(danms): A couple patches from now, we\u0027ll be able to"},{"line_number":5153,"context_line":"        # avoid this failure _if_ we get a new-style call with the"},{"line_number":5154,"context_line":"        # object."}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_30574928","line":5151,"range":{"start_line":5151,"start_character":8,"end_line":5151,"end_character":29},"in_reply_to":"ba63e191_fd674b23","updated":"2016-01-26 10:34:48.000000000","message":"Yep good call.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5178,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5179,"context_line":"                    migrate_data)"},{"line_number":5180,"context_line":""},{"line_number":5181,"context_line":"        # NOTE(danms): Remove these guards in v5.0 of the RPC API"},{"line_number":5182,"context_line":"        if migration:"},{"line_number":5183,"context_line":"            # NOTE(danms): We should enhance the RT to account for migrations"},{"line_number":5184,"context_line":"            # and use the status field to denote when the accounting has been"},{"line_number":5185,"context_line":"            # done on source/destination. For now, this is just here for status"},{"line_number":5186,"context_line":"            # reporting"},{"line_number":5187,"context_line":"            migration.status \u003d \u0027preparing\u0027"},{"line_number":5188,"context_line":"            migration.save()"},{"line_number":5189,"context_line":""},{"line_number":5190,"context_line":"        try:"},{"line_number":5191,"context_line":"            if block_migration:"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_3d4ba3b2","line":5188,"range":{"start_line":5181,"start_character":8,"end_line":5188,"end_character":28},"updated":"2016-01-18 19:23:13.000000000","message":"Aren\u0027t you already doing this on L5172?","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e05d3a3a2a1e3803fe2812899564ab1ac972dcb6","unresolved":false,"context_lines":[{"line_number":5178,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5179,"context_line":"                    migrate_data)"},{"line_number":5180,"context_line":""},{"line_number":5181,"context_line":"        # NOTE(danms): Remove these guards in v5.0 of the RPC API"},{"line_number":5182,"context_line":"        if migration:"},{"line_number":5183,"context_line":"            # NOTE(danms): We should enhance the RT to account for migrations"},{"line_number":5184,"context_line":"            # and use the status field to denote when the accounting has been"},{"line_number":5185,"context_line":"            # done on source/destination. For now, this is just here for status"},{"line_number":5186,"context_line":"            # reporting"},{"line_number":5187,"context_line":"            migration.status \u003d \u0027preparing\u0027"},{"line_number":5188,"context_line":"            migration.save()"},{"line_number":5189,"context_line":""},{"line_number":5190,"context_line":"        try:"},{"line_number":5191,"context_line":"            if block_migration:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_b36ca3d1","line":5188,"range":{"start_line":5181,"start_character":8,"end_line":5188,"end_character":28},"in_reply_to":"ba63e191_3d4ba3b2","updated":"2016-01-26 10:34:48.000000000","message":"This is rebase fallout. I didn\u0027t mean to actually add this in here.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5211,"context_line":""},{"line_number":5212,"context_line":"        if migrate_data:"},{"line_number":5213,"context_line":"            migrate_data.migration \u003d migration"},{"line_number":5214,"context_line":"        LOG.debug(\u0027live_migration data is %s\u0027 % migrate_data)"},{"line_number":5215,"context_line":"        try:"},{"line_number":5216,"context_line":"            self.driver.live_migration(context, instance, dest,"},{"line_number":5217,"context_line":"                                       self._post_live_migration,"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_fdf2eb6e","line":5214,"range":{"start_line":5214,"start_character":46,"end_line":5214,"end_character":47},"updated":"2016-01-18 19:23:13.000000000","message":"Use a comma.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5273,"context_line":"        #                 block storage or instance path were shared"},{"line_number":5274,"context_line":"        is_shared_block_storage \u003d not block_migration"},{"line_number":5275,"context_line":"        is_shared_instance_path \u003d not block_migration"},{"line_number":5276,"context_line":"        if isinstance(migrate_data, objects.LibvirtLiveMigrateData):"},{"line_number":5277,"context_line":"            is_shared_block_storage \u003d migrate_data.is_shared_block_storage"},{"line_number":5278,"context_line":"            is_shared_instance_path \u003d migrate_data.is_shared_instance_path"},{"line_number":5279,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_6fc40292","line":5276,"range":{"start_line":5276,"start_character":8,"end_line":5276,"end_character":68},"updated":"2016-01-18 19:23:13.000000000","message":"I think this is always an object now.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e05d3a3a2a1e3803fe2812899564ab1ac972dcb6","unresolved":false,"context_lines":[{"line_number":5273,"context_line":"        #                 block storage or instance path were shared"},{"line_number":5274,"context_line":"        is_shared_block_storage \u003d not block_migration"},{"line_number":5275,"context_line":"        is_shared_instance_path \u003d not block_migration"},{"line_number":5276,"context_line":"        if isinstance(migrate_data, objects.LibvirtLiveMigrateData):"},{"line_number":5277,"context_line":"            is_shared_block_storage \u003d migrate_data.is_shared_block_storage"},{"line_number":5278,"context_line":"            is_shared_instance_path \u003d migrate_data.is_shared_instance_path"},{"line_number":5279,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_534527b1","line":5276,"range":{"start_line":5276,"start_character":8,"end_line":5276,"end_character":68},"in_reply_to":"ba63e191_6fc40292","updated":"2016-01-26 10:34:48.000000000","message":"It is, but it\u0027s not always a libvirt object. This is leakage up into the manager of the libvirt details, which needs to be cleaned up, but since we just had a dict before, this detail leaked up unfortunately.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"fc5ffe0ea1e4caf0f3e45b843bdc553c860828f8","unresolved":false,"context_lines":[{"line_number":5299,"context_line":"        :param dest: destination host"},{"line_number":5300,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":5301,"context_line":"        :param migrate_data: if not None, it is a dict which has data"},{"line_number":5302,"context_line":"        required for live migration without shared storage"},{"line_number":5303,"context_line":""},{"line_number":5304,"context_line":"        \"\"\""},{"line_number":5305,"context_line":"        LOG.info(_LI(\u0027_post_live_migration() is started..\u0027),"}],"source_content_type":"text/x-python","patch_set":29,"id":"da6ed579_e4fd2f3c","line":5302,"updated":"2016-01-18 15:53:31.000000000","message":"It\u0027s not a dict anymore","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e05d3a3a2a1e3803fe2812899564ab1ac972dcb6","unresolved":false,"context_lines":[{"line_number":5299,"context_line":"        :param dest: destination host"},{"line_number":5300,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":5301,"context_line":"        :param migrate_data: if not None, it is a dict which has data"},{"line_number":5302,"context_line":"        required for live migration without shared storage"},{"line_number":5303,"context_line":""},{"line_number":5304,"context_line":"        \"\"\""},{"line_number":5305,"context_line":"        LOG.info(_LI(\u0027_post_live_migration() is started..\u0027),"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_f310dbad","line":5302,"in_reply_to":"da6ed579_e4fd2f3c","updated":"2016-01-26 10:34:48.000000000","message":"This is fixed in the following patch.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":5567,"context_line":"                migrate_data \u003d \\"},{"line_number":5568,"context_line":"                    migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5569,"context_line":"                        migrate_data)"},{"line_number":5570,"context_line":"            self.driver.rollback_live_migration_at_destination("},{"line_number":5571,"context_line":"                context, instance, network_info, block_device_info,"},{"line_number":5572,"context_line":"                destroy_disks\u003ddestroy_disks, migrate_data\u003dmigrate_data)"},{"line_number":5573,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_ef4c7278","line":5570,"range":{"start_line":5570,"start_character":24,"end_line":5570,"end_character":62},"updated":"2016-01-18 19:23:13.000000000","message":"This is now getting an object which it wasn\u0027t before. I checked the virt drivers and they are already handling an object, so it shouldn\u0027t be a problem. The compute driver doc strings don\u0027t explicitly call it out, but that could happen in the follow on change I guess.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eea75f66cf8b3e8006e0ec63e93e4da064d6c5ae","unresolved":false,"context_lines":[{"line_number":5054,"context_line":"        dest_check_data \u003d self.driver.check_can_live_migrate_destination(ctxt,"},{"line_number":5055,"context_line":"            instance, src_compute_info, dst_compute_info,"},{"line_number":5056,"context_line":"            block_migration, disk_over_commit)"},{"line_number":5057,"context_line":"        if isinstance(dest_check_data, migrate_data_obj.LiveMigrateData):"},{"line_number":5058,"context_line":"            dest_check_data \u003d dest_check_data.to_legacy_dict()"},{"line_number":5059,"context_line":"        migrate_data \u003d {}"},{"line_number":5060,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_838c9a36","side":"PARENT","line":5057,"updated":"2016-01-26 16:20:01.000000000","message":"This is all removed because we handle it in the compute RPC API now:\n\nreturn migrate_data_obj.LiveMigrateData.detect_implementation(result)\n\nRight?","commit_id":"ced52a6b4a1bf56f2b7b70edb5560d6dadaa709b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2daeca1d3d21f8a3a593bf0a7aa588dc6151f385","unresolved":false,"context_lines":[{"line_number":5054,"context_line":"        dest_check_data \u003d self.driver.check_can_live_migrate_destination(ctxt,"},{"line_number":5055,"context_line":"            instance, src_compute_info, dst_compute_info,"},{"line_number":5056,"context_line":"            block_migration, disk_over_commit)"},{"line_number":5057,"context_line":"        if isinstance(dest_check_data, migrate_data_obj.LiveMigrateData):"},{"line_number":5058,"context_line":"            dest_check_data \u003d dest_check_data.to_legacy_dict()"},{"line_number":5059,"context_line":"        migrate_data \u003d {}"},{"line_number":5060,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a5de9d1_83c4a692","side":"PARENT","line":5057,"in_reply_to":"9a68dd71_838c9a36","updated":"2016-01-27 15:47:49.000000000","message":"Yeah","commit_id":"ced52a6b4a1bf56f2b7b70edb5560d6dadaa709b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"665423cc4c32d3fce678137393715af9f2d638e5","unresolved":false,"context_lines":[{"line_number":5084,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5085,"context_line":"        if not got_migrate_data_object:"},{"line_number":5086,"context_line":"            dest_check_data \u003d \\"},{"line_number":5087,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5088,"context_line":"                    dest_check_data)"},{"line_number":5089,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"},{"line_number":5090,"context_line":"        block_device_info \u003d self._get_instance_block_device_info("}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_36bbaf77","line":5087,"updated":"2016-01-26 15:32:03.000000000","message":"See comments in PS29, I think if this is a liberty node (live migrate from mitaka to liberty) then this is going to cause AttributeError in the virt driver because we\u0027ll be sending in the base LiveMigrateData class which doesn\u0027t have the attributes (fields) defined that are in the base classes.","commit_id":"72406bbdaf95cb2394e0bffaf07c53418891b2f8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"74f9a62ebd8174a140ec7d7835c09e4e2bbad05d","unresolved":false,"context_lines":[{"line_number":5084,"context_line":"                                             migrate_data_obj.LiveMigrateData)"},{"line_number":5085,"context_line":"        if not got_migrate_data_object:"},{"line_number":5086,"context_line":"            dest_check_data \u003d \\"},{"line_number":5087,"context_line":"                migrate_data_obj.LiveMigrateData.detect_implementation("},{"line_number":5088,"context_line":"                    dest_check_data)"},{"line_number":5089,"context_line":"        dest_check_data.is_volume_backed \u003d is_volume_backed"},{"line_number":5090,"context_line":"        block_device_info \u003d self._get_instance_block_device_info("}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_4371c2df","line":5087,"in_reply_to":"9a68dd71_36bbaf77","updated":"2016-01-26 16:27:45.000000000","message":"Nevermind, this is handled in the detect_implementation method now.","commit_id":"72406bbdaf95cb2394e0bffaf07c53418891b2f8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"adb417f38f38ec3cdf21c551eaafe7b54b9584ca","unresolved":false,"context_lines":[{"line_number":5198,"context_line":""},{"line_number":5199,"context_line":"        if migrate_data:"},{"line_number":5200,"context_line":"            migrate_data.migration \u003d migration"},{"line_number":5201,"context_line":"        LOG.debug(\u0027live_migration data is %s\u0027, migrate_data)"},{"line_number":5202,"context_line":"        try:"},{"line_number":5203,"context_line":"            self.driver.live_migration(context, instance, dest,"},{"line_number":5204,"context_line":"                                       self._post_live_migration,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a5de9d1_2487d1b6","line":5201,"updated":"2016-01-28 11:28:10.000000000","message":"The LibvirtLiveMigrateData.bdms aren\u0027t set at this point:\n\nhttp://logs.openstack.org/50/272950/2/check/gate-grenade-dsvm-multinode/559128e//logs/new/screen-n-cpu.txt.gz#_2016-01-28_10_30_18_178\n\nTraceback (most recent call last):\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/hubs/hub.py\", line 457, in fire_timers\n    timer()\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/hubs/timer.py\", line 58, in __call__\n    cb(*args, **kw)\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/greenthread.py\", line 214, in main\n    result \u003d function(*args, **kwargs)\n  File \"/opt/stack/new/nova/nova/utils.py\", line 1160, in context_wrapper\n    return func(*args, **kwargs)\n  File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 5913, in _live_migration_operation\n    instance\u003dinstance)\n  File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 204, in __exit__\n    six.reraise(self.type_, self.value, self.tb)\n  File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 5860, in _live_migration_operation\n    not listen_addrs and not migrate_data.bdms)):\n  File \"/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py\", line 67, in getter\n    self.obj_load_attr(name)\n  File \"/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py\", line 578, in obj_load_attr\n    _(\"Cannot load \u0027%s\u0027 in the base class\") % attrname)\nNotImplementedError: Cannot load \u0027bdms\u0027 in the base class","commit_id":"145ed1fcee58ac55ad83524406f826a1ed10c5a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a39c36e8067a7b4052e5a7ec983a103521f4aa1","unresolved":false,"context_lines":[{"line_number":5127,"context_line":"                     context, instance, \"live_migration.pre.start\","},{"line_number":5128,"context_line":"                     network_info\u003dnetwork_info)"},{"line_number":5129,"context_line":""},{"line_number":5130,"context_line":"        migrate_data \u003d self.driver.pre_live_migration(context,"},{"line_number":5131,"context_line":"                                       instance,"},{"line_number":5132,"context_line":"                                       block_device_info,"},{"line_number":5133,"context_line":"                                       network_info,"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a5de9d1_98e38233","line":5130,"range":{"start_line":5130,"start_character":35,"end_line":5130,"end_character":53},"updated":"2016-01-28 14:07:09.000000000","message":"This is what sets serial_listen_addr, so we can\u0027t expect it in the detect_implementation call above (which calls from_legacy_dict).","commit_id":"5b02e44336bcac584aa0abfa920261cdad73d2d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2375becd029e507e93b2448769d9392df6e7256a","unresolved":false,"context_lines":[{"line_number":5152,"context_line":"                     context, instance, \"live_migration.pre.end\","},{"line_number":5153,"context_line":"                     network_info\u003dnetwork_info)"},{"line_number":5154,"context_line":""},{"line_number":5155,"context_line":"        if not got_migrate_data_object and migrate_data:"},{"line_number":5156,"context_line":"            migrate_data \u003d migrate_data.to_legacy_dict("},{"line_number":5157,"context_line":"                pre_migration_result\u003dTrue)"},{"line_number":5158,"context_line":"            migrate_data \u003d migrate_data[\u0027pre_live_migration_result\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_2e96c4f0","line":5155,"range":{"start_line":5155,"start_character":43,"end_line":5155,"end_character":55},"updated":"2016-01-28 14:56:35.000000000","message":"Why is this in here? Would it be None or empty?","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce6c556b351aa413f12cabb5d291f88be0a1fcde","unresolved":false,"context_lines":[{"line_number":5152,"context_line":"                     context, instance, \"live_migration.pre.end\","},{"line_number":5153,"context_line":"                     network_info\u003dnetwork_info)"},{"line_number":5154,"context_line":""},{"line_number":5155,"context_line":"        if not got_migrate_data_object and migrate_data:"},{"line_number":5156,"context_line":"            migrate_data \u003d migrate_data.to_legacy_dict("},{"line_number":5157,"context_line":"                pre_migration_result\u003dTrue)"},{"line_number":5158,"context_line":"            migrate_data \u003d migrate_data[\u0027pre_live_migration_result\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_e4e3eb03","line":5155,"range":{"start_line":5155,"start_character":43,"end_line":5155,"end_character":55},"in_reply_to":"7a5de9d1_2e96c4f0","updated":"2016-01-28 15:12:34.000000000","message":"Because the driver could return None for this if it doesn\u0027t have anything useful to return (i.e. hyperv)","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2375becd029e507e93b2448769d9392df6e7256a","unresolved":false,"context_lines":[{"line_number":5156,"context_line":"            migrate_data \u003d migrate_data.to_legacy_dict("},{"line_number":5157,"context_line":"                pre_migration_result\u003dTrue)"},{"line_number":5158,"context_line":"            migrate_data \u003d migrate_data[\u0027pre_live_migration_result\u0027]"},{"line_number":5159,"context_line":"        LOG.debug(\u0027pre_live_migration result data is %s\u0027 % migrate_data)"},{"line_number":5160,"context_line":"        return migrate_data"},{"line_number":5161,"context_line":""},{"line_number":5162,"context_line":"    def _do_live_migration(self, context, dest, instance, block_migration,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_8e8fb8cb","line":5159,"updated":"2016-01-28 14:56:35.000000000","message":"nit: pass migrate_data as an arg","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2375becd029e507e93b2448769d9392df6e7256a","unresolved":false,"context_lines":[{"line_number":5196,"context_line":""},{"line_number":5197,"context_line":"        self._set_migration_status(migration, \u0027running\u0027)"},{"line_number":5198,"context_line":""},{"line_number":5199,"context_line":"        if migrate_data:"},{"line_number":5200,"context_line":"            migrate_data.migration \u003d migration"},{"line_number":5201,"context_line":"        LOG.debug(\u0027live_migration data is %s\u0027, migrate_data)"},{"line_number":5202,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_8e7d78b3","line":5199,"range":{"start_line":5199,"start_character":11,"end_line":5199,"end_character":23},"updated":"2016-01-28 14:56:35.000000000","message":"Why would this be None?","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce6c556b351aa413f12cabb5d291f88be0a1fcde","unresolved":false,"context_lines":[{"line_number":5196,"context_line":""},{"line_number":5197,"context_line":"        self._set_migration_status(migration, \u0027running\u0027)"},{"line_number":5198,"context_line":""},{"line_number":5199,"context_line":"        if migrate_data:"},{"line_number":5200,"context_line":"            migrate_data.migration \u003d migration"},{"line_number":5201,"context_line":"        LOG.debug(\u0027live_migration data is %s\u0027, migrate_data)"},{"line_number":5202,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_e4f44b88","line":5199,"range":{"start_line":5199,"start_character":11,"end_line":5199,"end_character":23},"in_reply_to":"7a5de9d1_8e7d78b3","updated":"2016-01-28 15:12:34.000000000","message":"Because above.","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2375becd029e507e93b2448769d9392df6e7256a","unresolved":false,"context_lines":[{"line_number":5489,"context_line":"                    migrate_data)"},{"line_number":5490,"context_line":"        elif (isinstance(migrate_data, migrate_data_obj.LiveMigrateData) and"},{"line_number":5491,"context_line":"              migrate_data.obj_attr_is_set(\u0027migration\u0027)):"},{"line_number":5492,"context_line":"            migration \u003d migrate_data.migration"},{"line_number":5493,"context_line":"        else:"},{"line_number":5494,"context_line":"            migration \u003d None"},{"line_number":5495,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_096f42c6","line":5492,"updated":"2016-01-28 14:56:35.000000000","message":"Given the comment above:\n\n\"# NOTE(danms): Pop out the migration object so we don\u0027t pass\n        # it over RPC unintentionally below\"\n\nDo we need to null out the migration field on the object?","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce6c556b351aa413f12cabb5d291f88be0a1fcde","unresolved":false,"context_lines":[{"line_number":5489,"context_line":"                    migrate_data)"},{"line_number":5490,"context_line":"        elif (isinstance(migrate_data, migrate_data_obj.LiveMigrateData) and"},{"line_number":5491,"context_line":"              migrate_data.obj_attr_is_set(\u0027migration\u0027)):"},{"line_number":5492,"context_line":"            migration \u003d migrate_data.migration"},{"line_number":5493,"context_line":"        else:"},{"line_number":5494,"context_line":"            migration \u003d None"},{"line_number":5495,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_84fd573c","line":5492,"in_reply_to":"7a5de9d1_096f42c6","updated":"2016-01-28 15:12:34.000000000","message":"No, that comment is old from when there was a dict with an object in it just for internal context. So I\u0027ll remove it.","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"b331407b2383bd5b36573ef41993a8b7cc2ce1cc","unresolved":false,"context_lines":[{"line_number":642,"context_line":"            migrate_data_orig.from_legacy_dict(result)"},{"line_number":643,"context_line":"            return migrate_data_orig"},{"line_number":644,"context_line":"        else:"},{"line_number":645,"context_line":"            return result"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def prep_resize(self, ctxt, image, instance, instance_type, host,"},{"line_number":648,"context_line":"                    reservations\u003dNone, request_spec\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_9918d11f","line":645,"updated":"2015-12-14 11:31:17.000000000","message":"hang on, does this mean we might return {}?\n\nMaybe we should just return None here?","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2dfce133e9e3da5362651d8ce810bdd0f3f4938","unresolved":false,"context_lines":[{"line_number":642,"context_line":"            migrate_data_orig.from_legacy_dict(result)"},{"line_number":643,"context_line":"            return migrate_data_orig"},{"line_number":644,"context_line":"        else:"},{"line_number":645,"context_line":"            return result"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def prep_resize(self, ctxt, image, instance, instance_type, host,"},{"line_number":648,"context_line":"                    reservations\u003dNone, request_spec\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_aeb21347","line":645,"in_reply_to":"7a740942_9918d11f","updated":"2015-12-14 15:16:53.000000000","message":"It does, and I did this to be graceful about continuing to allow things that were previously returned to be returned to the upper layers. I think that\u0027s mostly because of unit tests. I\u0027ll revisit this, but I think I might have to change a bunch of other tests if I change this in an already large patch, but let me check again.","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"549334ca86f1dd9caa122cedc080c52327cdae09","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                                           block_migration, disk_over_commit):"},{"line_number":434,"context_line":"        version \u003d \u00274.0\u0027"},{"line_number":435,"context_line":"        cctxt \u003d self.client.prepare(server\u003ddestination, version\u003dversion)"},{"line_number":436,"context_line":"        return cctxt.call(ctxt, \u0027check_can_live_migrate_destination\u0027,"},{"line_number":437,"context_line":"                          instance\u003dinstance,"},{"line_number":438,"context_line":"                          block_migration\u003dblock_migration,"},{"line_number":439,"context_line":"                          disk_over_commit\u003ddisk_over_commit)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_180271b5","line":436,"range":{"start_line":436,"start_character":8,"end_line":436,"end_character":25},"updated":"2016-01-15 21:34:33.000000000","message":"Does this need to convert to an object if it\u0027s not an object from a liberty compute?","commit_id":"bb19739998690a98c0377025e2cce3ecce9bc7e6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"21a69a9a4bb032c86085bc16412fc467dc672605","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                                           block_migration, disk_over_commit):"},{"line_number":434,"context_line":"        version \u003d \u00274.0\u0027"},{"line_number":435,"context_line":"        cctxt \u003d self.client.prepare(server\u003ddestination, version\u003dversion)"},{"line_number":436,"context_line":"        return cctxt.call(ctxt, \u0027check_can_live_migrate_destination\u0027,"},{"line_number":437,"context_line":"                          instance\u003dinstance,"},{"line_number":438,"context_line":"                          block_migration\u003dblock_migration,"},{"line_number":439,"context_line":"                          disk_over_commit\u003ddisk_over_commit)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_189ef163","line":436,"range":{"start_line":436,"start_character":8,"end_line":436,"end_character":25},"in_reply_to":"da6ed579_180271b5","updated":"2016-01-15 21:37:01.000000000","message":"Sigh, yeah, probably.","commit_id":"bb19739998690a98c0377025e2cce3ecce9bc7e6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"549334ca86f1dd9caa122cedc080c52327cdae09","unresolved":false,"context_lines":[{"line_number":614,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":615,"context_line":"            version \u003d \u00274.2\u0027"},{"line_number":616,"context_line":"            if migrate_data:"},{"line_number":617,"context_line":"                migrate_data \u003d migrate_data.to_legacy_dict()"},{"line_number":618,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":619,"context_line":"            version \u003d \u00274.0\u0027"},{"line_number":620,"context_line":"        cctxt \u003d self.client.prepare(server\u003dhost, version\u003dversion)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_f82f5d3c","line":617,"range":{"start_line":617,"start_character":31,"end_line":617,"end_character":60},"updated":"2016-01-15 21:34:33.000000000","message":"Are we sure this is an object? It\u0027s passed in here:\n\nhttps://github.com/openstack/nova/blob/aaaba4a12eee10ae496e7e372777bfff217db401/nova/conductor/tasks/live_migrate.py#L72\n\nAnd that\u0027s set here:\n\nhttps://github.com/openstack/nova/blob/aaaba4a12eee10ae496e7e372777bfff217db401/nova/conductor/tasks/live_migrate.py#L154\n\nAnd I don\u0027t see check_can_live_migrate_destination converting a liberty result into an object.","commit_id":"bb19739998690a98c0377025e2cce3ecce9bc7e6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1fc23c6ef85acc0b7c0b0ebd6c5cbe5207381e43","unresolved":false,"context_lines":[{"line_number":614,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":615,"context_line":"            version \u003d \u00274.2\u0027"},{"line_number":616,"context_line":"            if migrate_data:"},{"line_number":617,"context_line":"                migrate_data \u003d migrate_data.to_legacy_dict()"},{"line_number":618,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":619,"context_line":"            version \u003d \u00274.0\u0027"},{"line_number":620,"context_line":"        cctxt \u003d self.client.prepare(server\u003dhost, version\u003dversion)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_5e3e912a","line":617,"range":{"start_line":617,"start_character":31,"end_line":617,"end_character":60},"in_reply_to":"da6ed579_f82f5d3c","updated":"2016-01-15 22:42:31.000000000","message":"Yep, the rpc call converts it to an object for us now.","commit_id":"bb19739998690a98c0377025e2cce3ecce9bc7e6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                            dest_check_data\u003ddest_check_data)"},{"line_number":460,"context_line":"        if isinstance(result, migrate_data_obj.LiveMigrateData):"},{"line_number":461,"context_line":"            return result"},{"line_number":462,"context_line":"        elif dest_check_data_obj and result:"},{"line_number":463,"context_line":"            dest_check_data_obj.from_legacy_dict(result)"},{"line_number":464,"context_line":"            return dest_check_data_obj"},{"line_number":465,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_e211eab0","line":462,"range":{"start_line":462,"start_character":13,"end_line":462,"end_character":32},"updated":"2016-01-18 19:23:13.000000000","message":"Is it possible to have a case where dest_check_data_obj is None but result isn\u0027t, and we could use migrate_data_obj.LiveMigrateData.detect_implementation to create the object?","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e05d3a3a2a1e3803fe2812899564ab1ac972dcb6","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                            dest_check_data\u003ddest_check_data)"},{"line_number":460,"context_line":"        if isinstance(result, migrate_data_obj.LiveMigrateData):"},{"line_number":461,"context_line":"            return result"},{"line_number":462,"context_line":"        elif dest_check_data_obj and result:"},{"line_number":463,"context_line":"            dest_check_data_obj.from_legacy_dict(result)"},{"line_number":464,"context_line":"            return dest_check_data_obj"},{"line_number":465,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_46e32734","line":462,"range":{"start_line":462,"start_character":13,"end_line":462,"end_character":32},"in_reply_to":"ba63e191_e211eab0","updated":"2016-01-26 10:34:48.000000000","message":"Not currently that I\u0027ve seen. Since this only needs to hang around until we can drop compat for RPC 4.x, I think we\u0027re fine. Not likely that we\u0027ll have any new virt drivers that support live migration but don\u0027t need any pre-check data between now and then. If we did, we\u0027d just have to tell them to provide an empty object.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"adb417f38f38ec3cdf21c551eaafe7b54b9584ca","unresolved":false,"context_lines":[{"line_number":626,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":627,"context_line":"            version \u003d \u00274.2\u0027"},{"line_number":628,"context_line":"            if migrate_data:"},{"line_number":629,"context_line":"                migrate_data \u003d migrate_data.to_legacy_dict()"},{"line_number":630,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":631,"context_line":"            version \u003d \u00274.0\u0027"},{"line_number":632,"context_line":"        cctxt \u003d self.client.prepare(server\u003dhost, version\u003dversion)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a5de9d1_84180586","line":629,"range":{"start_line":629,"start_character":31,"end_line":629,"end_character":60},"updated":"2016-01-28 11:28:10.000000000","message":"Need pre_migration_result\u003dTrue here?","commit_id":"145ed1fcee58ac55ad83524406f826a1ed10c5a2"}],"nova/objects/migrate_data.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"b331407b2383bd5b36573ef41993a8b7cc2ce1cc","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            self.migration \u003d legacy[\u0027migration\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def detect_implementation(cls, legacy_dict):"},{"line_number":52,"context_line":"        if \u0027instance_relative_path\u0027 in legacy_dict:"},{"line_number":53,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":54,"context_line":"        elif \u0027migrate_data\u0027 in legacy_dict:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_79940536","line":51,"updated":"2015-12-14 11:31:17.000000000","message":"Nit: create_correct_subclass_from_legacy_dict() feels like a better name, but I don\u0027t really like either of those.","commit_id":"cda29b74a881ab82321f888e22ec727e18d498b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def detect_implementation(cls, legacy_dict):"},{"line_number":52,"context_line":"        if \u0027instance_relative_path\u0027 in legacy_dict:"},{"line_number":53,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":54,"context_line":"        elif \u0027migrate_data\u0027 in legacy_dict:"},{"line_number":55,"context_line":"            obj \u003d XenapiLiveMigrateData()"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_c2862613","line":52,"updated":"2016-01-18 19:23:13.000000000","message":"Seems safe given it\u0027s always set here:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L5372\n\nAnd check_can_live_migrate_source is called from _do_check_can_live_migrate_destination in the compute manager, which is what\u0027s using this in the compute rpcapi.\n\nThis method could be a bit dangerous if it\u0027s not being used in that exact way, but I don\u0027t have any better suggestions besides the to_legacy_dict methods in the objects inject a type key or something.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        elif \u0027migrate_data\u0027 in legacy_dict:"},{"line_number":55,"context_line":"            obj \u003d XenapiLiveMigrateData()"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            obj \u003d LiveMigrateData()"},{"line_number":58,"context_line":"        obj.from_legacy_dict(legacy_dict)"},{"line_number":59,"context_line":"        return obj"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_02943e35","line":57,"range":{"start_line":57,"start_character":12,"end_line":57,"end_character":35},"updated":"2016-01-18 19:23:13.000000000","message":"Idea: we might want to log a debug message in this case if we aren\u0027t able to determine a specific type from the legacy_dict. Maybe not though given how this is used in the compute manager, at least considering check_can_live_migrate_source.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03160fa4e230314e9050434165430da1465269f9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \u0027type\u0027: fields.StringField(),"},{"line_number":72,"context_line":"        \u0027format\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":74,"context_line":"        \u0027connection_info_json\u0027: fields.StringField(),"},{"line_number":75,"context_line":"    }"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    # NOTE(danms): We don\u0027t have a connection_info object right"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba63e191_02f3de74","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":53},"updated":"2016-01-18 19:23:13.000000000","message":"I just thought about this, but this string can contain passwords, so anywhere that we are logging the LibvirtLiveMigrateData object could be dicey - except I think repr on LibvirtLiveMigrateData would only log bdms(\u003c?\u003e) or something like that, I think you\u0027d have to log list(dest_check_data.bdms) to actually log that out.\n\nAnyway, something to be careful about. I can update that to a PasswordField when I update the BDM object\u0027s connection_data attribute to be a PasswordField.","commit_id":"19b67f25cdff622b043d1a26bd198b994f0c4572"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2453537591ad179a0e3adb81d813a5258e3aeaac","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            self.migration \u003d legacy[\u0027migration\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def detect_implementation(cls, legacy_dict):"},{"line_number":52,"context_line":"        if \u0027instance_relative_path\u0027 in legacy_dict:"},{"line_number":53,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":54,"context_line":"        elif \u0027image_type\u0027 in legacy_dict:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_2cdcc017","line":51,"updated":"2016-01-26 15:59:50.000000000","message":"We should probably have a comment in here that notes the keys come from check_can_live_migrate_destination in the virt drivers and must come from there because of how it\u0027s used in the compute manager, and check destination is the first method that hits the virt driver in the live migration task.","commit_id":"72406bbdaf95cb2394e0bffaf07c53418891b2f8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2271540708c88f546dd94ca01f78f401be60a21f","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def detect_implementation(cls, legacy_dict):"},{"line_number":52,"context_line":"        if \u0027instance_relative_path\u0027 in legacy_dict:"},{"line_number":53,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":54,"context_line":"        elif \u0027image_type\u0027 in legacy_dict:"},{"line_number":55,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":56,"context_line":"        elif \u0027migrate_data\u0027 in legacy_dict:"},{"line_number":57,"context_line":"            obj \u003d XenapiLiveMigrateData()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_6c4ab857","line":54,"updated":"2016-01-26 15:47:55.000000000","message":"nit: This could just be an OR in the if check above.","commit_id":"72406bbdaf95cb2394e0bffaf07c53418891b2f8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2453537591ad179a0e3adb81d813a5258e3aeaac","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":54,"context_line":"        elif \u0027image_type\u0027 in legacy_dict:"},{"line_number":55,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":56,"context_line":"        elif \u0027migrate_data\u0027 in legacy_dict:"},{"line_number":57,"context_line":"            obj \u003d XenapiLiveMigrateData()"},{"line_number":58,"context_line":"        else:"},{"line_number":59,"context_line":"            obj \u003d LiveMigrateData()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_8719077c","line":56,"updated":"2016-01-26 15:59:50.000000000","message":"If we\u0027re using check destination, shouldn\u0027t we check migrate_send_data or destination_sr_ref given:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/xenapi/vmops.py#L2148-L2154\n\nHowever, those are only set if we\u0027re doing block migration...","commit_id":"72406bbdaf95cb2394e0bffaf07c53418891b2f8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0d9a64109680192770ce854d7399dbb253dc0e3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":54,"context_line":"        elif \u0027image_type\u0027 in legacy_dict:"},{"line_number":55,"context_line":"            obj \u003d LibvirtLiveMigrateData()"},{"line_number":56,"context_line":"        elif \u0027migrate_data\u0027 in legacy_dict:"},{"line_number":57,"context_line":"            obj \u003d XenapiLiveMigrateData()"},{"line_number":58,"context_line":"        else:"},{"line_number":59,"context_line":"            obj \u003d LiveMigrateData()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_e7e563dc","line":56,"in_reply_to":"9a68dd71_8719077c","updated":"2016-01-26 16:05:42.000000000","message":"Oh sorry, it would be migrate_data b/c of liberty:\n\nhttps://github.com/openstack/nova/blob/stable/liberty/nova/virt/xenapi/vmops.py#L2148\n\nBut we\u0027re still screwed in the non-block migration case since nothing is set. But then we just default to the base class, but when passing that to check_can_live_migrate_source this will be False:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/xenapi/vmops.py#L2193\n\nAnd then this would be False:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/xenapi/vmops.py#L2198\n\nBut if those are all False, it doesn\u0027t do anything anyway, so we don\u0027t really care...and they wouldn\u0027t be False if block_migration\u003dTrue in check destination and we\u0027d have the migrate_data key so we\u0027d detect the proper implementation, so I think we\u0027re covered (albeit by luck).","commit_id":"72406bbdaf95cb2394e0bffaf07c53418891b2f8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"568344566661c168c83a70ba21d0b2f1c60d2777","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        \u0027instance_relative_path\u0027: fields.StringField(),"},{"line_number":119,"context_line":"        \u0027graphics_listen_addr_vnc\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":120,"context_line":"        \u0027graphics_listen_addr_spice\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":121,"context_line":"        \u0027serial_listen_addr\u0027: fields.StringField(),"},{"line_number":122,"context_line":"        \u0027bdms\u0027: fields.ListOfObjectsField(\u0027LibvirtLiveMigrateBDMInfo\u0027),"},{"line_number":123,"context_line":"    }"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a5de9d1_634ff8bd","line":121,"updated":"2016-01-28 13:49:14.000000000","message":"This needs to be nullable\u003dTrue.","commit_id":"5b02e44336bcac584aa0abfa920261cdad73d2d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"568344566661c168c83a70ba21d0b2f1c60d2777","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                \u0027vnc\u0027: graphics_vnc and str(graphics_vnc),"},{"line_number":163,"context_line":"                \u0027spice\u0027: graphics_spice and str(graphics_spice),"},{"line_number":164,"context_line":"                },"},{"line_number":165,"context_line":"            \u0027serial_listen_addr\u0027: legacy.pop(\u0027serial_listen_addr\u0027, None),"},{"line_number":166,"context_line":"        }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        if pre_migration_result:"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a5de9d1_a355f050","line":165,"updated":"2016-01-28 13:49:14.000000000","message":"So this says serial_listen_addr can be None, but the field isn\u0027t defined as nullable\u003dTrue, so:\n\nhttp://logs.openstack.org/50/272950/3/check/gate-grenade-dsvm-multinode/2d46413//logs/new/screen-n-cpu.txt.gz?level\u003dTRACE#_2016-01-28_13_20_38_130","commit_id":"5b02e44336bcac584aa0abfa920261cdad73d2d8"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"879268e6f6ff77ef35f6c1f61877f093db88fb24","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            obj \u003d XenapiLiveMigrateData()"},{"line_number":58,"context_line":"        else:"},{"line_number":59,"context_line":"            obj \u003d LiveMigrateData()"},{"line_number":60,"context_line":"        obj.from_legacy_dict(legacy_dict)"},{"line_number":61,"context_line":"        return obj"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7a5de9d1_c7c0072d","line":60,"updated":"2016-01-29 08:20:18.000000000","message":"man is this ugly.... will be happy to get rid of legacy dict down the road.","commit_id":"b94c87fbd5e7550a0aed83a09e3b2c626d50059f"}],"nova/tests/unit/objects/test_migrate_data.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2375becd029e507e93b2448769d9392df6e7256a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_detect_implementation_none(self):"},{"line_number":46,"context_line":"        legacy \u003d migrate_data.LiveMigrateData().to_legacy_dict()"},{"line_number":47,"context_line":"        self.assertIsInstance("},{"line_number":48,"context_line":"            migrate_data.LiveMigrateData.detect_implementation(legacy),"},{"line_number":49,"context_line":"            migrate_data.LiveMigrateData)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_detect_implementation_libvirt(self):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_4eba20c2","line":48,"updated":"2016-01-28 14:56:35.000000000","message":"Is this screwed up and returned the libvirt or xen live migrate data objects, wouldn\u0027t the assertIsInstance still pass? Shouldn\u0027t we use something like self.assertEqual(migrate_data.LiveMigrateData, type(..))?","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67e1840f3cc5e963cdca9b8babbdb86498e8d64d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_detect_implementation_none(self):"},{"line_number":46,"context_line":"        legacy \u003d migrate_data.LiveMigrateData().to_legacy_dict()"},{"line_number":47,"context_line":"        self.assertIsInstance("},{"line_number":48,"context_line":"            migrate_data.LiveMigrateData.detect_implementation(legacy),"},{"line_number":49,"context_line":"            migrate_data.LiveMigrateData)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_detect_implementation_libvirt(self):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_7f1ea864","line":48,"in_reply_to":"7a5de9d1_4eba20c2","updated":"2016-01-28 15:11:54.000000000","message":"*if this","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce6c556b351aa413f12cabb5d291f88be0a1fcde","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_detect_implementation_none(self):"},{"line_number":46,"context_line":"        legacy \u003d migrate_data.LiveMigrateData().to_legacy_dict()"},{"line_number":47,"context_line":"        self.assertIsInstance("},{"line_number":48,"context_line":"            migrate_data.LiveMigrateData.detect_implementation(legacy),"},{"line_number":49,"context_line":"            migrate_data.LiveMigrateData)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_detect_implementation_libvirt(self):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_9f47e44a","line":48,"in_reply_to":"7a5de9d1_4eba20c2","updated":"2016-01-28 15:12:34.000000000","message":"No.","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cca814b23052df15e751a6dd3bc072f4f61d556b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_detect_implementation_none(self):"},{"line_number":46,"context_line":"        legacy \u003d migrate_data.LiveMigrateData().to_legacy_dict()"},{"line_number":47,"context_line":"        self.assertIsInstance("},{"line_number":48,"context_line":"            migrate_data.LiveMigrateData.detect_implementation(legacy),"},{"line_number":49,"context_line":"            migrate_data.LiveMigrateData)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_detect_implementation_libvirt(self):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a5de9d1_3f759097","line":48,"in_reply_to":"7a5de9d1_7f1ea864","updated":"2016-01-28 15:12:35.000000000","message":"Oh right, the base class case.","commit_id":"d360053b743be245652793d9bd5d11f758eacce0"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"78be03e6adf97370c9a0a44c2ef12d28daab074b","unresolved":false,"context_lines":[{"line_number":5201,"context_line":""},{"line_number":5202,"context_line":"        :param context: security context"},{"line_number":5203,"context_line":"        \"\"\""},{"line_number":5204,"context_line":"        filename \u003d dest_check_data.filename"},{"line_number":5205,"context_line":"        self._cleanup_shared_storage_test_file(filename)"},{"line_number":5206,"context_line":""},{"line_number":5207,"context_line":"    def check_can_live_migrate_source(self, context, instance,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_f5f91c4f","line":5204,"updated":"2015-12-11 16:13:47.000000000","message":"The previous patch claimed to be changing the virt driver to accept migration objects, so I\u0027d probably expect this change to be in the previous patch","commit_id":"2117de0cf576b6023e5f7401ad6d72f66a9dcfb1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d1542710fa7249e0d9703152351f6283e74c9f6","unresolved":false,"context_lines":[{"line_number":958,"context_line":"                self._cleanup_rbd(instance)"},{"line_number":959,"context_line":""},{"line_number":960,"context_line":"        if destroy_disks or ("},{"line_number":961,"context_line":"                migrate_data and migrate_data.get(\u0027is_shared_block_storage\u0027,"},{"line_number":962,"context_line":"                                                  False)):"},{"line_number":963,"context_line":"            attempts \u003d int(instance.system_metadata.get(\u0027clean_attempts\u0027,"},{"line_number":964,"context_line":"                                                        \u00270\u0027))"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_98e501de","line":961,"range":{"start_line":961,"start_character":33,"end_line":961,"end_character":76},"updated":"2016-01-15 21:39:39.000000000","message":"uh oh:\n\nhttp://logs.openstack.org/88/251588/26/check/gate-tempest-dsvm-multinode-full/748c334/logs/screen-n-cpu.txt.gz?level\u003dTRACE#_2016-01-15_18_55_19_856","commit_id":"bb19739998690a98c0377025e2cce3ecce9bc7e6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0bc3f40be629feb1a657488119b778721821233","unresolved":false,"context_lines":[{"line_number":5219,"context_line":"        :param instance: nova.db.sqlalchemy.models.Instance"},{"line_number":5220,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":5221,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":5222,"context_line":"        :returns: a dict containing:"},{"line_number":5223,"context_line":"             :filename: name of the tmpfile under CONF.instances_path"},{"line_number":5224,"context_line":"             :block_migration: whether this is block migration"},{"line_number":5225,"context_line":"             :disk_over_commit: disk-over-commit factor on dest host"}],"source_content_type":"text/x-python","patch_set":27,"id":"da6ed579_be86add9","line":5222,"range":{"start_line":5222,"start_character":8,"end_line":5222,"end_character":36},"updated":"2016-01-15 22:44:46.000000000","message":"Let\u0027s update this also.","commit_id":"ed5b7af425742bdae30c5625584aa8c818c1d833"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0bc3f40be629feb1a657488119b778721821233","unresolved":false,"context_lines":[{"line_number":5270,"context_line":"        :param instance: nova.db.sqlalchemy.models.Instance"},{"line_number":5271,"context_line":"        :param dest_check_data: result of check_can_live_migrate_destination"},{"line_number":5272,"context_line":"        :param block_device_info: result of _get_instance_block_device_info"},{"line_number":5273,"context_line":"        :returns: a dict containing migration info"},{"line_number":5274,"context_line":"        \"\"\""},{"line_number":5275,"context_line":"        # Checking shared storage connectivity"},{"line_number":5276,"context_line":"        # if block migration, instances_paths should not be on shared storage."}],"source_content_type":"text/x-python","patch_set":27,"id":"da6ed579_3e1cfdc0","line":5273,"range":{"start_line":5273,"start_character":9,"end_line":5273,"end_character":50},"updated":"2016-01-15 22:44:46.000000000","message":"Let\u0027s update this also.","commit_id":"ed5b7af425742bdae30c5625584aa8c818c1d833"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"568344566661c168c83a70ba21d0b2f1c60d2777","unresolved":false,"context_lines":[{"line_number":5693,"context_line":"            xml_doc \u003d self._update_graphics_xml(xml_doc, listen_addrs)"},{"line_number":5694,"context_line":"        else:"},{"line_number":5695,"context_line":"            self._check_graphics_addresses_can_live_migrate(listen_addrs)"},{"line_number":5696,"context_line":"        if serial_listen_addr:"},{"line_number":5697,"context_line":"            xml_doc \u003d self._update_serial_xml(xml_doc, serial_listen_addr)"},{"line_number":5698,"context_line":"        else:"},{"line_number":5699,"context_line":"            self._verify_serial_console_is_disabled()"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a5de9d1_5551530d","line":5696,"updated":"2016-01-28 13:49:14.000000000","message":"It is obviously optional here though...","commit_id":"5b02e44336bcac584aa0abfa920261cdad73d2d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"568344566661c168c83a70ba21d0b2f1c60d2777","unresolved":false,"context_lines":[{"line_number":6509,"context_line":"            migrate_data.bdms \u003d []"},{"line_number":6510,"context_line":"        migrate_data.graphics_listen_addr_vnc \u003d CONF.vnc.vncserver_listen"},{"line_number":6511,"context_line":"        migrate_data.graphics_listen_addr_spice \u003d CONF.spice.server_listen"},{"line_number":6512,"context_line":"        migrate_data.serial_listen_addr \u003d \\"},{"line_number":6513,"context_line":"            CONF.serial_console.proxyclient_address"},{"line_number":6514,"context_line":""},{"line_number":6515,"context_line":"        for vol in block_device_mapping:"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a5de9d1_35005701","line":6512,"updated":"2016-01-28 13:49:14.000000000","message":"By default this should be set to 127.0.0.1 so I\u0027m not sure why we\u0027d be hitting a case that serial_listen_addr isn\u0027t set in from_legacy_dict.","commit_id":"5b02e44336bcac584aa0abfa920261cdad73d2d8"}]}
