)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"87592eccdba206bc6bfc57d78cf681ee51f98e99","unresolved":false,"context_lines":[{"line_number":11,"context_line":"migration."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I6c2ad0170d90560d7d710b578c45287e78c682d1"},{"line_number":14,"context_line":"Closes-Bug: #1539271"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3ac371cc_6e2f5c88","line":14,"updated":"2016-08-17 15:45:03.000000000","message":"That bug looks unrelated to the code changes you\u0027re making here.","commit_id":"2741d2ca699fd9721a0228adfd8c64c96b83b275"},{"author":{"_account_id":17130,"name":"melissaml","email":"ma.lei@99cloud.net","username":"malei"},"change_message_id":"fe0ed092c165daaea90692013db7e93a10b4c016","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add migrate_uri for invoking the migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add migrate_uri paameter in Guest.migrate method, to indicate"},{"line_number":10,"context_line":"the URI where we want to stablish the connection in a non-tunneled"},{"line_number":11,"context_line":"migration."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3ac371cc_1d951532","line":9,"range":{"start_line":9,"start_character":16,"end_line":9,"end_character":24},"updated":"2016-08-18 07:29:11.000000000","message":"s/parameter/paameter/g","commit_id":"b586f3d71f3e8de057f3c36d7250f92a73695682"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"1f2909b446042acfc75c6f46dea7c35938bf6984","unresolved":false,"context_lines":[{"line_number":7693,"context_line":"            self.flags(live_migration_inbound_addr\u003daddr, group\u003d\u0027libvirt\u0027)"},{"line_number":7694,"context_line":""},{"line_number":7695,"context_line":"            drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":7696,"context_line":"            self.assertEqual(\u0027tcp://%s\u0027 % dest, drvr._migrate_uri(dest))"},{"line_number":7697,"context_line":""},{"line_number":7698,"context_line":"    def test_update_volume_xml_no_serial(self):"},{"line_number":7699,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da7fb54a_76f176cd","line":7696,"range":{"start_line":7696,"start_character":66,"end_line":7696,"end_character":70},"updated":"2016-09-02 17:24:32.000000000","message":"I like the idea of this test to check different IP addresses, but shouldn\u0027t you pass addr here instead of dest? live_migration_inbound_addr is not used by neither migrate_uri nor _live_migration_uri_template.","commit_id":"d7a22350f101f63755a746f9feadeb1bcd33c979"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"701267718947dadf72aea610cd179ece73083eca","unresolved":false,"context_lines":[{"line_number":7693,"context_line":"            self.flags(live_migration_inbound_addr\u003daddr, group\u003d\u0027libvirt\u0027)"},{"line_number":7694,"context_line":""},{"line_number":7695,"context_line":"            drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":7696,"context_line":"            self.assertEqual(\u0027tcp://%s\u0027 % dest, drvr._migrate_uri(dest))"},{"line_number":7697,"context_line":""},{"line_number":7698,"context_line":"    def test_update_volume_xml_no_serial(self):"},{"line_number":7699,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_a75e4943","line":7696,"range":{"start_line":7696,"start_character":66,"end_line":7696,"end_character":70},"in_reply_to":"da7fb54a_76f176cd","updated":"2016-09-05 09:43:29.000000000","message":"Done","commit_id":"d7a22350f101f63755a746f9feadeb1bcd33c979"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"0510d46979c81a4b3905cffd54153f68d4a29df8","unresolved":false,"context_lines":[{"line_number":745,"context_line":"    def _migrate_uri(dest):"},{"line_number":746,"context_line":"        uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":747,"context_line":"        netloc \u003d urlparse.urlparse(uri).netloc % dest"},{"line_number":748,"context_line":"        return \u0027tcp://%s\u0027 % netloc"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    def instance_exists(self, instance):"},{"line_number":751,"context_line":"        \"\"\"Efficient override of base instance_exists method.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_29f8bec2","line":748,"updated":"2016-08-17 16:01:04.000000000","message":"You\u0027re substituting dest into the URI template, then immediately pulling the exact same value back out again.\n\nAlso this should only be set for kvm \u0026 qemu. So you really ought to have a similar lookup table\n\n  uris \u003d {\n     \u0027kvm\u0027: \u0027tcp://%s\u0027,\n     \u0027kvm\u0027: \u0027tcp://%s\u0027,\n     \u0027xen\u0027: None\n  }\n\nand just subsitute \u0027dest\u0027 directly into that, and not change the existing _live_migration_uri code at all.","commit_id":"b586f3d71f3e8de057f3c36d7250f92a73695682"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"8a2b64dcb459a4db0b0f2558a21db7dc2dfacd7f","unresolved":false,"context_lines":[{"line_number":745,"context_line":"    def _migrate_uri(dest):"},{"line_number":746,"context_line":"        uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":747,"context_line":"        netloc \u003d urlparse.urlparse(uri).netloc % dest"},{"line_number":748,"context_line":"        return \u0027tcp://%s\u0027 % netloc"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    def instance_exists(self, instance):"},{"line_number":751,"context_line":"        \"\"\"Efficient override of base instance_exists method.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_a464d3b8","line":748,"in_reply_to":"3ac371cc_29f8bec2","updated":"2016-08-17 16:13:33.000000000","message":"Is `miguri` parameter for migrateToURI[23] not used in xen? I think it is, at least in virsh CLI, but I can recheck.\n\nAlso I can\u0027t do the direct substitution as you recommend at the end. I want to maintain the same template that is in live_migration_uri parameter in nova.conf\n\nIf this parameter is \u0027qemu+tcp://something.%s/system\u0027, migrate_uri needs to be \u0027tcp://something.%s\u0027, not \u0027tcp://%s\u0027, this is the cause of the bug.","commit_id":"b586f3d71f3e8de057f3c36d7250f92a73695682"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"0253951220864dca91dfa7f926b3ab13e41fb038","unresolved":false,"context_lines":[{"line_number":745,"context_line":"    def _migrate_uri(dest):"},{"line_number":746,"context_line":"        uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":747,"context_line":"        netloc \u003d urlparse.urlparse(uri).netloc % dest"},{"line_number":748,"context_line":"        return \u0027tcp://%s\u0027 % netloc"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    def instance_exists(self, instance):"},{"line_number":751,"context_line":"        \"\"\"Efficient override of base instance_exists method.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_48f18d6a","line":748,"in_reply_to":"3ac371cc_6ac8e5a8","updated":"2016-08-18 08:01:47.000000000","message":"Using the migrate URI parameter is only relevant if doing PEER2PEER migration - this is not used with Xen in OpenStack, so setting the it is not desired.","commit_id":"b586f3d71f3e8de057f3c36d7250f92a73695682"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"e20922f6c37f653c54ede71e6006154b2a557596","unresolved":false,"context_lines":[{"line_number":745,"context_line":"    def _migrate_uri(dest):"},{"line_number":746,"context_line":"        uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":747,"context_line":"        netloc \u003d urlparse.urlparse(uri).netloc % dest"},{"line_number":748,"context_line":"        return \u0027tcp://%s\u0027 % netloc"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    def instance_exists(self, instance):"},{"line_number":751,"context_line":"        \"\"\"Efficient override of base instance_exists method.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_6ac8e5a8","line":748,"in_reply_to":"3ac371cc_a464d3b8","updated":"2016-08-17 16:24:19.000000000","message":"Looks like that is used, but I can be wrong.\n\nhttps://github.com/libvirt/libvirt/blob/master/src/xen/xend_internal.c#L2498","commit_id":"b586f3d71f3e8de057f3c36d7250f92a73695682"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"97ff594b31d5fc289d62466d5cabd06fc91cd718","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        if virt_type !\u003d \u0027xen\u0027:"},{"line_number":749,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":750,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":751,"context_line":"            uri \u003d \u0027tcp://%s\u0027 % netloc"},{"line_number":752,"context_line":"        else:"},{"line_number":753,"context_line":"            uri \u003d None"},{"line_number":754,"context_line":"        return uri"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_da781afb","line":751,"updated":"2016-08-25 14:18:39.000000000","message":"Is it worth describing here why you use tcp even if uri might be configured to use ssh?","commit_id":"53a4945809d0ab4a8d70958d4dbed6f1f537cc38"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"004c5636c79823e5da821ec5a1ad25a3181c7bd5","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        if virt_type !\u003d \u0027xen\u0027:"},{"line_number":749,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":750,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":751,"context_line":"            uri \u003d \u0027tcp://%s\u0027 % netloc"},{"line_number":752,"context_line":"        else:"},{"line_number":753,"context_line":"            uri \u003d None"},{"line_number":754,"context_line":"        return uri"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_ab3992a5","line":751,"in_reply_to":"1ac06dbe_da781afb","updated":"2016-08-25 15:04:09.000000000","message":"Done","commit_id":"53a4945809d0ab4a8d70958d4dbed6f1f537cc38"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"97ff594b31d5fc289d62466d5cabd06fc91cd718","unresolved":false,"context_lines":[{"line_number":749,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":750,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":751,"context_line":"            uri \u003d \u0027tcp://%s\u0027 % netloc"},{"line_number":752,"context_line":"        else:"},{"line_number":753,"context_line":"            uri \u003d None"},{"line_number":754,"context_line":"        return uri"},{"line_number":755,"context_line":""},{"line_number":756,"context_line":"    def instance_exists(self, instance):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_a549dab9","line":753,"range":{"start_line":752,"start_character":8,"end_line":753,"end_character":22},"updated":"2016-08-25 14:18:39.000000000","message":"Please remove this else and move uri \u003d None to line above if virt_type !\u003d \u0027xen\u0027","commit_id":"53a4945809d0ab4a8d70958d4dbed6f1f537cc38"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"004c5636c79823e5da821ec5a1ad25a3181c7bd5","unresolved":false,"context_lines":[{"line_number":749,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":750,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":751,"context_line":"            uri \u003d \u0027tcp://%s\u0027 % netloc"},{"line_number":752,"context_line":"        else:"},{"line_number":753,"context_line":"            uri \u003d None"},{"line_number":754,"context_line":"        return uri"},{"line_number":755,"context_line":""},{"line_number":756,"context_line":"    def instance_exists(self, instance):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_eb438a11","line":753,"range":{"start_line":752,"start_character":8,"end_line":753,"end_character":22},"in_reply_to":"1ac06dbe_a549dab9","updated":"2016-08-25 15:04:09.000000000","message":"Done","commit_id":"53a4945809d0ab4a8d70958d4dbed6f1f537cc38"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"97ff594b31d5fc289d62466d5cabd06fc91cd718","unresolved":false,"context_lines":[{"line_number":5963,"context_line":"                    params.pop(\u0027migrate_disks\u0027)"},{"line_number":5964,"context_line":""},{"line_number":5965,"context_line":"            guest.migrate(self._live_migration_uri(dest),"},{"line_number":5966,"context_line":"                          migrate_uri\u003dmigrate_uri,"},{"line_number":5967,"context_line":"                          flags\u003dmigration_flags,"},{"line_number":5968,"context_line":"                          params\u003dparams,"},{"line_number":5969,"context_line":"                          domain_xml\u003dnew_xml_str,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_faea3673","line":5966,"updated":"2016-08-25 14:18:39.000000000","message":"I don\u0027t like the idea of passing migrate_uri explicitly and inside params dict, but all this code needs a refactor so I won\u0027t complain about it here.","commit_id":"53a4945809d0ab4a8d70958d4dbed6f1f537cc38"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"004c5636c79823e5da821ec5a1ad25a3181c7bd5","unresolved":false,"context_lines":[{"line_number":5963,"context_line":"                    params.pop(\u0027migrate_disks\u0027)"},{"line_number":5964,"context_line":""},{"line_number":5965,"context_line":"            guest.migrate(self._live_migration_uri(dest),"},{"line_number":5966,"context_line":"                          migrate_uri\u003dmigrate_uri,"},{"line_number":5967,"context_line":"                          flags\u003dmigration_flags,"},{"line_number":5968,"context_line":"                          params\u003dparams,"},{"line_number":5969,"context_line":"                          domain_xml\u003dnew_xml_str,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_6b44bab6","line":5966,"in_reply_to":"1ac06dbe_faea3673","updated":"2016-08-25 15:04:09.000000000","message":"Ah good point. I can fix it!","commit_id":"53a4945809d0ab4a8d70958d4dbed6f1f537cc38"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"24b8836c0b0172a543d3c3f4504d6c0bace65c6b","unresolved":false,"context_lines":[{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type !\u003d \u0027xen\u0027:"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # QEMU accept two schemes: tcp and rdma.  By default"},{"line_number":674,"context_line":"            # libvirt build th URI using the remote hostname and the"},{"line_number":675,"context_line":"            # tcp schema."}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_c8732ab3","line":672,"range":{"start_line":672,"start_character":21,"end_line":672,"end_character":54},"updated":"2016-09-01 07:26:04.000000000","message":"If url looks like \"tcp://stack@lm-%s/system\" it will not work, because netloc value will be \"stack@lm-%s\". What QEMU expects is just IP address/hostname","commit_id":"6568a59570ed2746f024e00a78680d1d0e02b465"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"0b9e988d8a74acb9e92a14b3a23b9ab2e624138c","unresolved":false,"context_lines":[{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type !\u003d \u0027xen\u0027:"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # QEMU accept two schemes: tcp and rdma.  By default"},{"line_number":674,"context_line":"            # libvirt build th URI using the remote hostname and the"},{"line_number":675,"context_line":"            # tcp schema."}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_35612da9","line":672,"range":{"start_line":672,"start_character":21,"end_line":672,"end_character":54},"in_reply_to":"fa7ab95a_2812d609","updated":"2016-09-01 15:50:24.000000000","message":"Done","commit_id":"6568a59570ed2746f024e00a78680d1d0e02b465"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"8e6abf90931954dd6c2f4f1c32a3728dfb8352a8","unresolved":false,"context_lines":[{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type !\u003d \u0027xen\u0027:"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # QEMU accept two schemes: tcp and rdma.  By default"},{"line_number":674,"context_line":"            # libvirt build th URI using the remote hostname and the"},{"line_number":675,"context_line":"            # tcp schema."}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_2812d609","line":672,"range":{"start_line":672,"start_character":21,"end_line":672,"end_character":54},"in_reply_to":"fa7ab95a_c8732ab3","updated":"2016-09-01 07:33:01.000000000","message":"Right. Very good point. Fixing it.","commit_id":"6568a59570ed2746f024e00a78680d1d0e02b465"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"28931c9c4be39bfee354eab08337c7bff3761fa1","unresolved":false,"context_lines":[{"line_number":5855,"context_line":"                dest \u003d migrate_data.target_connect_addr"},{"line_number":5856,"context_line":""},{"line_number":5857,"context_line":"            new_xml_str \u003d None"},{"line_number":5858,"context_line":"            migrate_uri \u003d self._migrate_uri(dest)"},{"line_number":5859,"context_line":"            params \u003d None"},{"line_number":5860,"context_line":"            if (self._host.is_migratable_xml_flag() and ("},{"line_number":5861,"context_line":"                    listen_addrs or migrate_data.bdms)):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_85f2eb98","line":5858,"range":{"start_line":5858,"start_character":12,"end_line":5858,"end_character":49},"updated":"2016-09-01 07:15:35.000000000","message":"This shouldn\u0027t be set if migrate_flags \u0026 libvirt.VIR_MIGRATE_TUNNELLED !\u003d 0","commit_id":"6568a59570ed2746f024e00a78680d1d0e02b465"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"0b9e988d8a74acb9e92a14b3a23b9ab2e624138c","unresolved":false,"context_lines":[{"line_number":5855,"context_line":"                dest \u003d migrate_data.target_connect_addr"},{"line_number":5856,"context_line":""},{"line_number":5857,"context_line":"            new_xml_str \u003d None"},{"line_number":5858,"context_line":"            migrate_uri \u003d self._migrate_uri(dest)"},{"line_number":5859,"context_line":"            params \u003d None"},{"line_number":5860,"context_line":"            if (self._host.is_migratable_xml_flag() and ("},{"line_number":5861,"context_line":"                    listen_addrs or migrate_data.bdms)):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_bece0781","line":5858,"range":{"start_line":5858,"start_character":12,"end_line":5858,"end_character":49},"in_reply_to":"fa7ab95a_85f2eb98","updated":"2016-09-01 15:50:24.000000000","message":"Done","commit_id":"6568a59570ed2746f024e00a78680d1d0e02b465"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"fd9dc81a39fd9f84ace2c17ad65ab5aa9c1e312f","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"},{"line_number":675,"context_line":"            # Remove the port information"},{"line_number":676,"context_line":"            netloc \u003d netloc.split(\u0027:\u0027)[0]"},{"line_number":677,"context_line":"            # QEMU accept two schemes: tcp and rdma.  By default"},{"line_number":678,"context_line":"            # libvirt build the URI using the remote hostname and the"},{"line_number":679,"context_line":"            # tcp schema."}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_f5b15be1","line":676,"updated":"2016-09-02 10:24:46.000000000","message":"QEMU supports live migration over IPv4 and IPv6, this will not work with IPv6.\n\nWhat about validating whether netloc is a valid ip address, if it is then just return \u0027tcp://%s\u0027 % netloc, if it isn\u0027t then strip all the data so that netloc will contain only the hostname?","commit_id":"a82a6c74fd1acefbbb043e02faf4f4fe2dd1a486"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"e26a5ecfb6a8efa11dd8c8409ac59ade76fd9b4a","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"},{"line_number":675,"context_line":"            # Remove the port information"},{"line_number":676,"context_line":"            netloc \u003d netloc.split(\u0027:\u0027)[0]"},{"line_number":677,"context_line":"            # QEMU accept two schemes: tcp and rdma.  By default"},{"line_number":678,"context_line":"            # libvirt build the URI using the remote hostname and the"},{"line_number":679,"context_line":"            # tcp schema."}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_6e99f878","line":676,"in_reply_to":"fa7ab95a_588dde7a","updated":"2016-09-02 11:49:34.000000000","message":"So I think that you don\u0027t need to care about port here, because migrate_uri can actually support custom port.\n\nCorrect me if I\u0027m wrong, but the solution can look like:\n* live_migration_inbound_addr is configured, it might contain IP address or hostname of source node and optionally a port. In both cases we can just return \u0027tcp://%\u0027 % netloc because migrate_uri supports custom port.\n* live_migration_uri is configured. This configuration option cannot contain IP address, as nova should fill this uri with a name of destination host which is in fact destination\u0027s hostname that should be configured in /etc/hosts. All that needs to be stripped out of this is user, I think.","commit_id":"a82a6c74fd1acefbbb043e02faf4f4fe2dd1a486"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"ba76cb4ce626171cd6a9ae887eafd476a312af0a","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"},{"line_number":675,"context_line":"            # Remove the port information"},{"line_number":676,"context_line":"            netloc \u003d netloc.split(\u0027:\u0027)[0]"},{"line_number":677,"context_line":"            # QEMU accept two schemes: tcp and rdma.  By default"},{"line_number":678,"context_line":"            # libvirt build the URI using the remote hostname and the"},{"line_number":679,"context_line":"            # tcp schema."}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_a2386cd4","line":676,"in_reply_to":"fa7ab95a_6e99f878","updated":"2016-09-02 13:22:37.000000000","message":"I hope that the new patch set address this correctly. I updated the test case to check both scenarios.","commit_id":"a82a6c74fd1acefbbb043e02faf4f4fe2dd1a486"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"ae98c12d79c3c2215936efe3e668435a3ea42455","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"},{"line_number":675,"context_line":"            # Remove the port information"},{"line_number":676,"context_line":"            netloc \u003d netloc.split(\u0027:\u0027)[0]"},{"line_number":677,"context_line":"            # QEMU accept two schemes: tcp and rdma.  By default"},{"line_number":678,"context_line":"            # libvirt build the URI using the remote hostname and the"},{"line_number":679,"context_line":"            # tcp schema."}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_588dde7a","line":676,"in_reply_to":"fa7ab95a_f5b15be1","updated":"2016-09-02 10:35:45.000000000","message":"Very good point.\n\n\u003e What about validating whether netloc is a valid ip address, if it is then just return \u0027tcp://%s\u0027 % netloc\n\nIIUC the proposal, this will not work again in IPv6. Looks like that IPv6 also support ports. What is your opinion about this:\n\n\u003e\u003e\u003e \u0027[1fff:0:a88:85a3::ac1f]:8001\u0027.rsplit(\u0027:\u0027, 1)[0]\n\u0027[1fff:0:a88:85a3::ac1f]\u0027\n\nI can factorize this out if the netloc handling is too complicated now.","commit_id":"a82a6c74fd1acefbbb043e02faf4f4fe2dd1a486"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6658cdc8d813b3af3cec1b913ed8b3f3cc9683b7","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        # Only QEMU live migrations supports migrate-uri parameter"},{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_2e820e53","line":671,"updated":"2016-09-05 10:31:38.000000000","message":"Please don\u0027t use this. You should just substitute \u0027dest\u0027 straight into the \u0027tcp://%s\u0027 URI below. We don\u0027t want to further propagate the hack where people use magic host names in the CONF.libvirt.live_migration_uri parameter, as this fix makes that hack obsolete.","commit_id":"4a773732d94dc22b82c0a459d637e44a1af640c2"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"2c0def56ea76fb6c25ba2d3bd3dfdf026438c4d6","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        # Only QEMU live migrations supports migrate-uri parameter"},{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_6957b002","line":671,"in_reply_to":"9a89bdaa_2e820e53","updated":"2016-09-05 10:47:55.000000000","message":"I will change the code as recommended, but this makes me wonder how the user can set a different host name for the migration.\n\n`nova live-migration UUID hostname`\n\nFor this case `dest` will be hostname. If the user wants to specify a different one, the only way will be via `live_migration_inbound_addr`.\n\nI think that we lost something is the user can\u0027t set the hostname for the migration, but only the IP.","commit_id":"4a773732d94dc22b82c0a459d637e44a1af640c2"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"9a17bc16ca845dbb1e7ee2807064257a6110408c","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        # Only QEMU live migrations supports migrate-uri parameter"},{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_4ddcb712","line":671,"in_reply_to":"9a89bdaa_49ccac35","updated":"2016-09-05 11:20:53.000000000","message":"Indirectly you can, via the live_migration_uri:\n\n  nova live-migrate UUID hostname-a\n\nWith his patch:\n\n  live_migration_uri \u003d \u0027qemu+tcp://radom-prefix.%s/system\u0027\n  dest \u003d \u0027hostname-a\u0027\n  _live_migration_uri \u003d \u0027qemu+tcp://radom-prefix.hostname-a/system\u0027\n  _migrate_url \u003d \u0027radom-prefix.hostname-a\u0027\n\nBut I think that I get your point.\n\nDone.","commit_id":"4a773732d94dc22b82c0a459d637e44a1af640c2"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"dab06d0e3a8d2f95f9d1c9c3311faee93f077d15","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        # Only QEMU live migrations supports migrate-uri parameter"},{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_0d262fce","line":671,"in_reply_to":"9a89bdaa_4ddcb712","updated":"2016-09-05 11:29:21.000000000","message":"That requires the cloud admin to configure nova.conf upfront - which is no different burden to configuration of live_migration_inbound_addr, so we\u0027re not loosing any functionality from the POV of the person invoking live migration from the API - it has always required nova.conf settings ahead of time.","commit_id":"4a773732d94dc22b82c0a459d637e44a1af640c2"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"aa0287cb8422ae3a7edbf52e9bb44bcf523a6cf5","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        # Only QEMU live migrations supports migrate-uri parameter"},{"line_number":669,"context_line":"        virt_type \u003d CONF.libvirt.virt_type"},{"line_number":670,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":671,"context_line":"            uri \u003d LibvirtDriver._live_migration_uri_template()"},{"line_number":672,"context_line":"            netloc \u003d urllib.parse.urlparse(uri).netloc % dest"},{"line_number":673,"context_line":"            # Remove the user and password information"},{"line_number":674,"context_line":"            netloc \u003d netloc.split(\u0027@\u0027)[-1]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_49ccac35","line":671,"in_reply_to":"9a89bdaa_6957b002","updated":"2016-09-05 11:02:47.000000000","message":"You don\u0027t get to choose an arbitrary hostname via the \u0027nova live-migration\u0027 command - the hostname must match the hostname provided in the compute_nodes table. The use of live_migration_inbound_addr is the only other supported approach to change live migration host. To allow arbitrary user specified hostnames would be a security flaw.","commit_id":"4a773732d94dc22b82c0a459d637e44a1af640c2"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"dceab881943da6f243960b50edbf4261e3eddf25","unresolved":false,"context_lines":[{"line_number":5877,"context_line":"                    params.pop(\u0027migrate_disks\u0027)"},{"line_number":5878,"context_line":"            if (migration_flags \u0026"},{"line_number":5879,"context_line":"                    libvirt.VIR_MIGRATE_TUNNELLED !\u003d 0):"},{"line_number":5880,"context_line":"                migrate_uri \u003d self._migrate_uri(dest)"},{"line_number":5881,"context_line":""},{"line_number":5882,"context_line":"            guest.migrate(self._live_migration_uri(dest),"},{"line_number":5883,"context_line":"                          migrate_uri\u003dmigrate_uri,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a89bdaa_b55e4110","line":5880,"updated":"2016-09-06 09:56:05.000000000","message":"This looks like the *opposite* of what we actually want. When doing TUNNELLED migration, the migrate_uri parameter is irrelevant/unused, since QEMU migration data is sent over the libvirtd connection.","commit_id":"2713509fc4ed70085a1b3f91169aa4124bb01a12"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"d49a1e21858f73fd831ba509af51a4b8e5369f06","unresolved":false,"context_lines":[{"line_number":5877,"context_line":"                    params.pop(\u0027migrate_disks\u0027)"},{"line_number":5878,"context_line":"            if (migration_flags \u0026"},{"line_number":5879,"context_line":"                    libvirt.VIR_MIGRATE_TUNNELLED !\u003d 0):"},{"line_number":5880,"context_line":"                migrate_uri \u003d self._migrate_uri(dest)"},{"line_number":5881,"context_line":""},{"line_number":5882,"context_line":"            guest.migrate(self._live_migration_uri(dest),"},{"line_number":5883,"context_line":"                          migrate_uri\u003dmigrate_uri,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a89bdaa_95e85d12","line":5880,"in_reply_to":"9a89bdaa_b55e4110","updated":"2016-09-06 10:43:44.000000000","message":"Done","commit_id":"2713509fc4ed70085a1b3f91169aa4124bb01a12"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"5967c6b4ad3c3b3560f06413a41a844a33bc7d95","unresolved":false,"context_lines":[{"line_number":5842,"context_line":""},{"line_number":5843,"context_line":"            listen_addrs \u003d libvirt_migrate.graphics_listen_addrs("},{"line_number":5844,"context_line":"                migrate_data)"},{"line_number":5845,"context_line":"            if (\u0027target_connect_addr\u0027 in migrate_data and"},{"line_number":5846,"context_line":"                    migrate_data.target_connect_addr is not None):"},{"line_number":5847,"context_line":"                dest \u003d migrate_data.target_connect_addr"},{"line_number":5848,"context_line":""},{"line_number":5849,"context_line":"            new_xml_str \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_fdc08c2c","line":5846,"range":{"start_line":5845,"start_character":12,"end_line":5846,"end_character":66},"updated":"2016-09-06 20:05:29.000000000","message":"I think that migrate_uri should be set only if this condition is met (i.e. here, not in line #5880). We don\u0027t want to set migrate_uri if target_connect_addr is None, because someone might still be using hack to live migrate instances over dedicated network.","commit_id":"a7c585fc7d100c09793e9463725d70e52ab18074"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"e3436660ef8cfc697b85b8438d9758dfa62237fb","unresolved":false,"context_lines":[{"line_number":5842,"context_line":""},{"line_number":5843,"context_line":"            listen_addrs \u003d libvirt_migrate.graphics_listen_addrs("},{"line_number":5844,"context_line":"                migrate_data)"},{"line_number":5845,"context_line":"            if (\u0027target_connect_addr\u0027 in migrate_data and"},{"line_number":5846,"context_line":"                    migrate_data.target_connect_addr is not None):"},{"line_number":5847,"context_line":"                dest \u003d migrate_data.target_connect_addr"},{"line_number":5848,"context_line":""},{"line_number":5849,"context_line":"            new_xml_str \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_9510225b","line":5846,"range":{"start_line":5845,"start_character":12,"end_line":5846,"end_character":66},"in_reply_to":"9a89bdaa_15bdf201","updated":"2016-09-07 08:43:15.000000000","message":"migrate_uri works with both, hostnames and IPs - https://github.com/openstack/nova/blob/a76954bec36336f21e95a96471d3c9dd1a5efe64/nova/conf/libvirt.py#L237\n\nGiven that in the near future we want to remove live_migration_uri from nova.conf this is the correct approach, I think. Also your change right now breaks every environment which does not have live_migration_inbound_addr set and uses a hack with a hostname to run live migrations on a dedicated network, e.g. live_migration_uri \u003d tcp://fast.%s/system.","commit_id":"a7c585fc7d100c09793e9463725d70e52ab18074"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"3b88ee46e539cd8e023c611e2385df8f86f6f353","unresolved":false,"context_lines":[{"line_number":5842,"context_line":""},{"line_number":5843,"context_line":"            listen_addrs \u003d libvirt_migrate.graphics_listen_addrs("},{"line_number":5844,"context_line":"                migrate_data)"},{"line_number":5845,"context_line":"            if (\u0027target_connect_addr\u0027 in migrate_data and"},{"line_number":5846,"context_line":"                    migrate_data.target_connect_addr is not None):"},{"line_number":5847,"context_line":"                dest \u003d migrate_data.target_connect_addr"},{"line_number":5848,"context_line":""},{"line_number":5849,"context_line":"            new_xml_str \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_7032cc60","line":5846,"range":{"start_line":5845,"start_character":12,"end_line":5846,"end_character":66},"in_reply_to":"9a89bdaa_9510225b","updated":"2016-09-07 08:46:47.000000000","message":"Thanks for the detailed answer! Very useful.","commit_id":"a7c585fc7d100c09793e9463725d70e52ab18074"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"06cf9f4cea4af25df1ffd220cf61d133f43eeb64","unresolved":false,"context_lines":[{"line_number":5842,"context_line":""},{"line_number":5843,"context_line":"            listen_addrs \u003d libvirt_migrate.graphics_listen_addrs("},{"line_number":5844,"context_line":"                migrate_data)"},{"line_number":5845,"context_line":"            if (\u0027target_connect_addr\u0027 in migrate_data and"},{"line_number":5846,"context_line":"                    migrate_data.target_connect_addr is not None):"},{"line_number":5847,"context_line":"                dest \u003d migrate_data.target_connect_addr"},{"line_number":5848,"context_line":""},{"line_number":5849,"context_line":"            new_xml_str \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_15bdf201","line":5846,"range":{"start_line":5845,"start_character":12,"end_line":5846,"end_character":66},"in_reply_to":"9a89bdaa_fdc08c2c","updated":"2016-09-07 08:28:40.000000000","message":"So migrate_uri will only work for IPs?\n\nI am not fully happy with this: qemu accepts hostname and ip for this parameter, but nova will only accept the ip.\n\nBut I guess that this will make a bit more consistent the change. But I really think that there is a better, and more clear solution, based on live_migration_uri. Because, at the end, this is the expected parameter to change in order to specify the migration URI.\n\nI will adjust the code as you suggest. For a more deep change based on live_migration do I need to create a blueprint, or is OK to address this in another commit?","commit_id":"a7c585fc7d100c09793e9463725d70e52ab18074"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"5967c6b4ad3c3b3560f06413a41a844a33bc7d95","unresolved":false,"context_lines":[{"line_number":5875,"context_line":"                if (migration_flags \u0026"},{"line_number":5876,"context_line":"                    libvirt.VIR_MIGRATE_TUNNELLED !\u003d 0):"},{"line_number":5877,"context_line":"                    params.pop(\u0027migrate_disks\u0027)"},{"line_number":5878,"context_line":"            if (migration_flags \u0026"},{"line_number":5879,"context_line":"                    libvirt.VIR_MIGRATE_PEER2PEER !\u003d 0):"},{"line_number":5880,"context_line":"                migrate_uri \u003d self._migrate_uri(dest)"},{"line_number":5881,"context_line":""},{"line_number":5882,"context_line":"            guest.migrate(self._live_migration_uri(dest),"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_1d89b026","line":5879,"range":{"start_line":5878,"start_character":16,"end_line":5879,"end_character":54},"updated":"2016-09-06 20:05:29.000000000","message":"It should be migration_flags \u0026 libvirt.VIR_MIGRATE_TUNNELLED \u003d\u003d 0","commit_id":"a7c585fc7d100c09793e9463725d70e52ab18074"},{"author":{"_account_id":13404,"name":"Alberto Planas","email":"aplanas@gmail.com","username":"aplanas"},"change_message_id":"06cf9f4cea4af25df1ffd220cf61d133f43eeb64","unresolved":false,"context_lines":[{"line_number":5875,"context_line":"                if (migration_flags \u0026"},{"line_number":5876,"context_line":"                    libvirt.VIR_MIGRATE_TUNNELLED !\u003d 0):"},{"line_number":5877,"context_line":"                    params.pop(\u0027migrate_disks\u0027)"},{"line_number":5878,"context_line":"            if (migration_flags \u0026"},{"line_number":5879,"context_line":"                    libvirt.VIR_MIGRATE_PEER2PEER !\u003d 0):"},{"line_number":5880,"context_line":"                migrate_uri \u003d self._migrate_uri(dest)"},{"line_number":5881,"context_line":""},{"line_number":5882,"context_line":"            guest.migrate(self._live_migration_uri(dest),"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_355116d9","line":5879,"range":{"start_line":5878,"start_character":16,"end_line":5879,"end_character":54},"in_reply_to":"9a89bdaa_1d89b026","updated":"2016-09-07 08:28:40.000000000","message":"Ah... I was thinking about that. Is not this check more explicit? Or I am missing something?","commit_id":"a7c585fc7d100c09793e9463725d70e52ab18074"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"e3436660ef8cfc697b85b8438d9758dfa62237fb","unresolved":false,"context_lines":[{"line_number":5875,"context_line":"                if (migration_flags \u0026"},{"line_number":5876,"context_line":"                    libvirt.VIR_MIGRATE_TUNNELLED !\u003d 0):"},{"line_number":5877,"context_line":"                    params.pop(\u0027migrate_disks\u0027)"},{"line_number":5878,"context_line":"            if (migration_flags \u0026"},{"line_number":5879,"context_line":"                    libvirt.VIR_MIGRATE_PEER2PEER !\u003d 0):"},{"line_number":5880,"context_line":"                migrate_uri \u003d self._migrate_uri(dest)"},{"line_number":5881,"context_line":""},{"line_number":5882,"context_line":"            guest.migrate(self._live_migration_uri(dest),"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_504f886a","line":5879,"range":{"start_line":5878,"start_character":16,"end_line":5879,"end_character":54},"in_reply_to":"9a89bdaa_355116d9","updated":"2016-09-07 08:43:15.000000000","message":"Those two flags are not exclusive OR. Both can be enabled at the same time.\n\nhttps://review.openstack.org/#/c/356558/11/nova/virt/libvirt/driver.py@545","commit_id":"a7c585fc7d100c09793e9463725d70e52ab18074"}]}
