)]}'
{"openstack/compute/v2/_proxy.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":1169,"context_line":""},{"line_number":1170,"context_line":"    def live_migrate_server("},{"line_number":1171,"context_line":"            self, server, host\u003dNone, force\u003dFalse,"},{"line_number":1172,"context_line":"            block_migration\u003dNone, disk_over_commit\u003dFalse):"},{"line_number":1173,"context_line":"        \"\"\"Migrate a server from one host to target host"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"        :param server:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_eeea9f72","line":1172,"range":{"start_line":1172,"start_character":34,"end_line":1172,"end_character":50},"updated":"2018-06-28 19:44:28.000000000","message":"This isn\u0027t in your docstring params.\n\nAlso not sure how much you want to document it, but it\u0027s only available with compute API \u003c2.25.\n\nAlso, you\u0027re not passing this through and it\u0027s a required parameter if \u003c2.25.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":1169,"context_line":""},{"line_number":1170,"context_line":"    def live_migrate_server("},{"line_number":1171,"context_line":"            self, server, host\u003dNone, force\u003dFalse,"},{"line_number":1172,"context_line":"            block_migration\u003dNone, disk_over_commit\u003dFalse):"},{"line_number":1173,"context_line":"        \"\"\"Migrate a server from one host to target host"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"        :param server:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_e22cf3b3","line":1172,"range":{"start_line":1172,"start_character":34,"end_line":1172,"end_character":50},"in_reply_to":"5f7c97a3_eeea9f72","updated":"2018-06-28 21:00:13.000000000","message":"I actually don\u0027t want to add it at all but forgot to delete it. SDK doesn\u0027t have it as a feature today and it\u0027s already deprecated.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a6338ddf3b8946adc5b94b5dc5f2e06af9d25afd","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    def live_migrate_server("},{"line_number":1171,"context_line":"            self, server, host\u003dNone, force\u003dFalse,"},{"line_number":1172,"context_line":"            block_migration\u003dNone, disk_over_commit\u003dFalse):"},{"line_number":1173,"context_line":"        \"\"\"Migrate a server from one host to target host"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"        :param server:"},{"line_number":1176,"context_line":"            Either the ID of a server or a"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_626f8393","line":1173,"range":{"start_line":1173,"start_character":11,"end_line":1173,"end_character":18},"updated":"2018-06-28 19:49:36.000000000","message":"nit: while updating docs, I\u0027d change this to say \u0027Live migrate\u0027.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    def live_migrate_server("},{"line_number":1171,"context_line":"            self, server, host\u003dNone, force\u003dFalse,"},{"line_number":1172,"context_line":"            block_migration\u003dNone, disk_over_commit\u003dFalse):"},{"line_number":1173,"context_line":"        \"\"\"Migrate a server from one host to target host"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"        :param server:"},{"line_number":1176,"context_line":"            Either the ID of a server or a"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a236fb01","line":1173,"range":{"start_line":1173,"start_character":11,"end_line":1173,"end_character":18},"in_reply_to":"5f7c97a3_626f8393","updated":"2018-06-28 21:00:13.000000000","message":"Done","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":1175,"context_line":"        :param server:"},{"line_number":1176,"context_line":"            Either the ID of a server or a"},{"line_number":1177,"context_line":"            :class:`~openstack.compute.v2.server.Server` instance."},{"line_number":1178,"context_line":"        :param host: The host to which to migrate the server"},{"line_number":1179,"context_line":"        :param force:"},{"line_number":1180,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1181,"context_line":"            host by the scheduler."},{"line_number":1182,"context_line":"        :param block_migration:"},{"line_number":1183,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1184,"context_line":"        :returns: None"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_6e79afc3","line":1181,"range":{"start_line":1178,"start_character":8,"end_line":1181,"end_character":34},"updated":"2018-06-28 19:44:28.000000000","message":"Is this what\u0027s used to generate the actual docs?\n\nhttps://docs.openstack.org/openstacksdk/latest/user/proxies/compute.html#openstack.compute.v2._proxy.Proxy.live_migrate_server\n\nIf so, I\u0027d mention the version restrictions around host and force and I\u0027d also include the warnings on their usage from the compute API reference (people really shouldn\u0027t be using force):\n\nhttps://developer.openstack.org/api-ref/compute/#id130\n\nThe force parameter was added in 2.30 for backward compatibility because before 2.30 if you specified a host, we always bypassed the scheduler (same as force\u003dTrue \u003e\u003d 2.30). The change in 2.30 was that if you specify host w/o force you could get the scheduler to validate the specified host, which is nice (and like force_hosts with server create:\n\nhttps://docs.openstack.org/nova/latest/admin/availability-zones.html\n\n--\n\nMaybe that\u0027s all more than you want to deal with this in this change and you would just like me to stfu and add the docs in a follow up? If so, that\u0027s cool.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":1175,"context_line":"        :param server:"},{"line_number":1176,"context_line":"            Either the ID of a server or a"},{"line_number":1177,"context_line":"            :class:`~openstack.compute.v2.server.Server` instance."},{"line_number":1178,"context_line":"        :param host: The host to which to migrate the server"},{"line_number":1179,"context_line":"        :param force:"},{"line_number":1180,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1181,"context_line":"            host by the scheduler."},{"line_number":1182,"context_line":"        :param block_migration:"},{"line_number":1183,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1184,"context_line":"        :returns: None"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_c5578101","line":1181,"range":{"start_line":1178,"start_character":8,"end_line":1181,"end_character":34},"in_reply_to":"5f7c97a3_6e79afc3","updated":"2018-06-28 21:00:13.000000000","message":"WELL - except that this interface should not be exposing the microversion stuff to end users.\n\nBut this is great, as I think we\u0027ll eventually end up with a supportable behavior.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62aaf1bc20f5a06740bf1f3bc6bf12ea33192a85","unresolved":false,"context_lines":[{"line_number":1175,"context_line":"        :param server:"},{"line_number":1176,"context_line":"            Either the ID of a server or a"},{"line_number":1177,"context_line":"            :class:`~openstack.compute.v2.server.Server` instance."},{"line_number":1178,"context_line":"        :param host: The host to which to migrate the server"},{"line_number":1179,"context_line":"        :param force:"},{"line_number":1180,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1181,"context_line":"            host by the scheduler."},{"line_number":1182,"context_line":"        :param block_migration:"},{"line_number":1183,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1184,"context_line":"        :returns: None"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3c5c304b","line":1181,"range":{"start_line":1178,"start_character":8,"end_line":1181,"end_character":34},"in_reply_to":"5f7c97a3_c5578101","updated":"2018-06-30 12:12:30.000000000","message":"\u003e WELL - except that this interface should not be exposing the microversion stuff to end users.\n\nAck, yeah, gonna take a mental shift for me to get used to that way of doing this interface.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"        :param force:"},{"line_number":1180,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1181,"context_line":"            host by the scheduler."},{"line_number":1182,"context_line":"        :param block_migration:"},{"line_number":1183,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1184,"context_line":"        :returns: None"},{"line_number":1185,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_6e8befbf","line":1182,"updated":"2018-06-28 19:44:28.000000000","message":"I don\u0027t know how much you want to document this stuff, but block_migration behavior is different on the 2.25 boundary: \u003c2.25 is a boolean:\n\n\"Set to True to migrate local disks by using block migration. If the source or destination host uses shared storage and you set this value to True, the live migration fails.\"\n\n\u003e\u003d2.25 it\u0027s a string and can be \"auto\" if you want the compute service to figure out if it\u0027s on shared storage or not. I would default to \"auto\" if not specified in that case.\n\nFor \u003c2.25, novaclient defaults block_migration to False if that helps at all.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62aaf1bc20f5a06740bf1f3bc6bf12ea33192a85","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"        :param force:"},{"line_number":1180,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1181,"context_line":"            host by the scheduler."},{"line_number":1182,"context_line":"        :param block_migration:"},{"line_number":1183,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1184,"context_line":"        :returns: None"},{"line_number":1185,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5c57ac28","line":1182,"in_reply_to":"5f7c97a3_65c78d48","updated":"2018-06-30 12:12:30.000000000","message":"Yup that sounds good.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"        :param force:"},{"line_number":1180,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1181,"context_line":"            host by the scheduler."},{"line_number":1182,"context_line":"        :param block_migration:"},{"line_number":1183,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1184,"context_line":"        :returns: None"},{"line_number":1185,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_65c78d48","line":1182,"in_reply_to":"5f7c97a3_6e8befbf","updated":"2018-06-28 21:00:13.000000000","message":"What I\u0027m thinking is that we default block_migration to False if it\u0027s older than 2.25 and \u0027auto\u0027 if it\u0027s 2.25 or newer.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":1180,"context_line":"            Nova scheduler to be bypassed. On such clouds, a ``ValueError``"},{"line_number":1181,"context_line":"            will be thrown if ``host`` is given without ``force``."},{"line_number":1182,"context_line":"        :param bool force:"},{"line_number":1183,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1184,"context_line":"            host by the scheduler."},{"line_number":1185,"context_line":"        :param block_migration:"},{"line_number":1186,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1187,"context_line":"            Can be \u0027auto\u0027, True or False. Some clouds are too old to support"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_3c2190b6","line":1184,"range":{"start_line":1183,"start_character":12,"end_line":1184,"end_character":34},"updated":"2018-06-30 12:26:59.000000000","message":"Could we add something like, \"This is unsafe and not recommended.\"?","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b4b4d47009f30a9b2756f1a27f757f015cb9255f","unresolved":false,"context_lines":[{"line_number":1180,"context_line":"            Nova scheduler to be bypassed. On such clouds, a ``ValueError``"},{"line_number":1181,"context_line":"            will be thrown if ``host`` is given without ``force``."},{"line_number":1182,"context_line":"        :param bool force:"},{"line_number":1183,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1184,"context_line":"            host by the scheduler."},{"line_number":1185,"context_line":"        :param block_migration:"},{"line_number":1186,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1187,"context_line":"            Can be \u0027auto\u0027, True or False. Some clouds are too old to support"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_ed3fd21f","line":1184,"range":{"start_line":1183,"start_character":12,"end_line":1184,"end_character":34},"in_reply_to":"5f7c97a3_3c2190b6","updated":"2018-07-02 13:52:13.000000000","message":"Absolutely!","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1184,"context_line":"            host by the scheduler."},{"line_number":1185,"context_line":"        :param block_migration:"},{"line_number":1186,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1187,"context_line":"            Can be \u0027auto\u0027, True or False. Some clouds are too old to support"},{"line_number":1188,"context_line":"            \u0027auto\u0027, in which case a ValueError will be thrown. If omitted, the"},{"line_number":1189,"context_line":"            value will be \u0027auto\u0027 on clouds that support it, and False on clouds"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_5c1c8c7a","line":1186,"range":{"start_line":1186,"start_character":43,"end_line":1186,"end_character":54},"updated":"2018-06-30 12:26:59.000000000","message":"nit: to the destination host?","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b4b4d47009f30a9b2756f1a27f757f015cb9255f","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"            Force a live-migration by not verifying the provided destination"},{"line_number":1184,"context_line":"            host by the scheduler."},{"line_number":1185,"context_line":"        :param block_migration:"},{"line_number":1186,"context_line":"            Perform a block live migration destination host by the scheduler."},{"line_number":1187,"context_line":"            Can be \u0027auto\u0027, True or False. Some clouds are too old to support"},{"line_number":1188,"context_line":"            \u0027auto\u0027, in which case a ValueError will be thrown. If omitted, the"},{"line_number":1189,"context_line":"            value will be \u0027auto\u0027 on clouds that support it, and False on clouds"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_4d0a8679","line":1186,"range":{"start_line":1186,"start_character":43,"end_line":1186,"end_character":54},"in_reply_to":"5f7c97a3_5c1c8c7a","updated":"2018-07-02 13:52:13.000000000","message":"Done","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"}],"openstack/compute/v2/server.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63042979f77fa8eb4bc9cd0492d7359874bf9bbc","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            }"},{"line_number":373,"context_line":"        }"},{"line_number":374,"context_line":"        if force:"},{"line_number":375,"context_line":"            if utils.supports_microversion(\u00272.3\u0027):"},{"line_number":376,"context_line":"                body[\u0027force\u0027] \u003d force"},{"line_number":377,"context_line":"                microversion \u003d \u00272.3\u0027"},{"line_number":378,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_f3004c69","line":375,"updated":"2018-06-28 18:43:55.000000000","message":"2.30:\n\nhttps://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id27","commit_id":"5bc9978ae5b3d079254eb533d6c5b8fe241debdc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63042979f77fa8eb4bc9cd0492d7359874bf9bbc","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                microversion \u003d \u00272.3\u0027"},{"line_number":378,"context_line":"            else:"},{"line_number":379,"context_line":"                raise ValueError("},{"line_number":380,"context_line":"                    \"Live migration does not support the \u0027force\u0027 paramter\""},{"line_number":381,"context_line":"                    \" until microversion 2.3\")"},{"line_number":382,"context_line":"        self._action(session, body, microversion\u003dmicroversion)"},{"line_number":383,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_53d6e0f4","line":380,"range":{"start_line":380,"start_character":65,"end_line":380,"end_character":73},"updated":"2018-06-28 18:43:55.000000000","message":"parameter","commit_id":"5bc9978ae5b3d079254eb533d6c5b8fe241debdc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        resp \u003d self._action(session, body)"},{"line_number":364,"context_line":"        return resp.json()"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def live_migrate(self, session, host, force, block_migration):"},{"line_number":367,"context_line":"        if utils.supports_microversion(\u00272.30\u0027):"},{"line_number":368,"context_line":"            return self._live_migrate_30("},{"line_number":369,"context_line":"                session, host,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_4215a73c","line":366,"updated":"2018-06-28 19:44:28.000000000","message":"Don\u0027t you need to pass through disk_over_commit?","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        resp \u003d self._action(session, body)"},{"line_number":364,"context_line":"        return resp.json()"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def live_migrate(self, session, host, force, block_migration):"},{"line_number":367,"context_line":"        if utils.supports_microversion(\u00272.30\u0027):"},{"line_number":368,"context_line":"            return self._live_migrate_30("},{"line_number":369,"context_line":"                session, host,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a5e285d3","line":366,"in_reply_to":"5f7c97a3_4215a73c","updated":"2018-06-28 21:00:13.000000000","message":"Or delete it.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62aaf1bc20f5a06740bf1f3bc6bf12ea33192a85","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        resp \u003d self._action(session, body)"},{"line_number":364,"context_line":"        return resp.json()"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def live_migrate(self, session, host, force, block_migration):"},{"line_number":367,"context_line":"        if utils.supports_microversion(\u00272.30\u0027):"},{"line_number":368,"context_line":"            return self._live_migrate_30("},{"line_number":369,"context_line":"                session, host,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_fc55581f","line":366,"in_reply_to":"5f7c97a3_a5e285d3","updated":"2018-06-30 12:12:30.000000000","message":"OK, but \u003c2.25 you still have to pass disk_over_commit\u003dFalse.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        return resp.json()"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def live_migrate(self, session, host, force, block_migration):"},{"line_number":367,"context_line":"        if utils.supports_microversion(\u00272.30\u0027):"},{"line_number":368,"context_line":"            return self._live_migrate_30("},{"line_number":369,"context_line":"                session, host,"},{"line_number":370,"context_line":"                force\u003dforce,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a26b5bb7","line":367,"range":{"start_line":367,"start_character":17,"end_line":367,"end_character":38},"updated":"2018-06-28 19:44:28.000000000","message":"You need to pass the compute endpoint adapter variable to this method....how about some tests?","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        return resp.json()"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def live_migrate(self, session, host, force, block_migration):"},{"line_number":367,"context_line":"        if utils.supports_microversion(\u00272.30\u0027):"},{"line_number":368,"context_line":"            return self._live_migrate_30("},{"line_number":369,"context_line":"                session, host,"},{"line_number":370,"context_line":"                force\u003dforce,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_e5715dad","line":367,"range":{"start_line":367,"start_character":17,"end_line":367,"end_character":38},"in_reply_to":"5f7c97a3_a26b5bb7","updated":"2018-06-28 21:00:13.000000000","message":"Whoops. Thanks.\n\nAnd yeah - tests for sure before this lands - mostly wanted to make sure the interface choices weren\u0027t crazy before doing that.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":383,"context_line":"    def _live_migrate_30(self, session, host, force, block_migration):"},{"line_number":384,"context_line":"        microversion \u003d \u00272.30\u0027"},{"line_number":385,"context_line":"        body \u003d {}"},{"line_number":386,"context_line":"        if block_migration is None:"},{"line_number":387,"context_line":"            block_migration \u003d \u0027auto\u0027"},{"line_number":388,"context_line":"        body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":389,"context_line":"        if host:"},{"line_number":390,"context_line":"            body[\u0027host\u0027] \u003d host"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_8262dfd8","line":387,"range":{"start_line":386,"start_character":8,"end_line":387,"end_character":36},"updated":"2018-06-28 19:44:28.000000000","message":"Yup, good call.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":383,"context_line":"    def _live_migrate_30(self, session, host, force, block_migration):"},{"line_number":384,"context_line":"        microversion \u003d \u00272.30\u0027"},{"line_number":385,"context_line":"        body \u003d {}"},{"line_number":386,"context_line":"        if block_migration is None:"},{"line_number":387,"context_line":"            block_migration \u003d \u0027auto\u0027"},{"line_number":388,"context_line":"        body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":389,"context_line":"        if host:"},{"line_number":390,"context_line":"            body[\u0027host\u0027] \u003d host"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_255f5510","line":387,"range":{"start_line":386,"start_character":8,"end_line":387,"end_character":36},"in_reply_to":"5f7c97a3_8262dfd8","updated":"2018-06-28 21:00:13.000000000","message":"\\o/","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":389,"context_line":"        if host:"},{"line_number":390,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":391,"context_line":"            if force:"},{"line_number":392,"context_line":"                    body[\u0027force\u0027] \u003d force"},{"line_number":393,"context_line":"        self._action("},{"line_number":394,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_425cc718","line":392,"range":{"start_line":392,"start_character":15,"end_line":392,"end_character":20},"updated":"2018-06-28 19:44:28.000000000","message":"dedent","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":389,"context_line":"        if host:"},{"line_number":390,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":391,"context_line":"            if force:"},{"line_number":392,"context_line":"                    body[\u0027force\u0027] \u003d force"},{"line_number":393,"context_line":"        self._action("},{"line_number":394,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_8562e9d8","line":392,"range":{"start_line":392,"start_character":15,"end_line":392,"end_character":20},"in_reply_to":"5f7c97a3_425cc718","updated":"2018-06-28 21:00:13.000000000","message":"Done","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self._action("},{"line_number":394,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _live_migrate_25(self, session, host, force, block_migration):"},{"line_number":397,"context_line":"        microversion \u003d \u00272.25\u0027"},{"line_number":398,"context_line":"        body \u003d {}"},{"line_number":399,"context_line":"        if block_migration is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_228d0b7c","line":396,"range":{"start_line":396,"start_character":46,"end_line":396,"end_character":51},"updated":"2018-06-28 19:44:28.000000000","message":"There is no force parameter for live migration before 2.30.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62aaf1bc20f5a06740bf1f3bc6bf12ea33192a85","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self._action("},{"line_number":394,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _live_migrate_25(self, session, host, force, block_migration):"},{"line_number":397,"context_line":"        microversion \u003d \u00272.25\u0027"},{"line_number":398,"context_line":"        body \u003d {}"},{"line_number":399,"context_line":"        if block_migration is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_bc2da0af","line":396,"range":{"start_line":396,"start_character":46,"end_line":396,"end_character":51},"in_reply_to":"5f7c97a3_059c99bd","updated":"2018-06-30 12:12:30.000000000","message":"\u003e So the sdk interface is that host *always* requires force\u003dTrue to do the unsafe thing\n\nSo how does someone that wants to specify a host \u003e\u003d 2.30 and have the scheduler validate it (force\u003dFalse) do that with the SDK? Do they pass host and force\u003dFalse explicitly? Or that\u0027s just not an option in the SDK right now?","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self._action("},{"line_number":394,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _live_migrate_25(self, session, host, force, block_migration):"},{"line_number":397,"context_line":"        microversion \u003d \u00272.25\u0027"},{"line_number":398,"context_line":"        body \u003d {}"},{"line_number":399,"context_line":"        if block_migration is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_059c99bd","line":396,"range":{"start_line":396,"start_character":46,"end_line":396,"end_character":51},"in_reply_to":"5f7c97a3_228d0b7c","updated":"2018-06-28 21:00:13.000000000","message":"But there is always a force parameter in the sdk.\n\nIn this case, the force parameter can be used for \u003e\u003d2.30 as a way for an SDK user to indicate that they understand that \u0027host\u0027 in \u003c2.30 always essentially has \"force\" set.\n\nSo the sdk interface is that host *always* requires force\u003dTrue to do the unsafe thing - and in earlier clouds it\u0027ll just not pass anything.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                    \"Live migration before microversion 2.30 implies \u0027force\u0027\""},{"line_number":407,"context_line":"                    \" if the \u0027host\u0027 option has been given and it is not\""},{"line_number":408,"context_line":"                    \" possible to disable. It is recommended to not use \u0027host\u0027\""},{"line_number":409,"context_line":"                    \" at all, but if it is unavoidable, please supply\""},{"line_number":410,"context_line":"                    \" \u0027force\u003dTrue\u0027\")"},{"line_number":411,"context_line":"        self._action("},{"line_number":412,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_e2e4f344","line":410,"range":{"start_line":409,"start_character":56,"end_line":410,"end_character":34},"updated":"2018-06-28 19:44:28.000000000","message":"same as below - tell them to use \u003e\u003d2.30, not force.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                    \"Live migration before microversion 2.30 implies \u0027force\u0027\""},{"line_number":407,"context_line":"                    \" if the \u0027host\u0027 option has been given and it is not\""},{"line_number":408,"context_line":"                    \" possible to disable. It is recommended to not use \u0027host\u0027\""},{"line_number":409,"context_line":"                    \" at all, but if it is unavoidable, please supply\""},{"line_number":410,"context_line":"                    \" \u0027force\u003dTrue\u0027\")"},{"line_number":411,"context_line":"        self._action("},{"line_number":412,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_458a9164","line":410,"range":{"start_line":409,"start_character":56,"end_line":410,"end_character":34},"in_reply_to":"5f7c97a3_e2e4f344","updated":"2018-06-28 21:00:13.000000000","message":"The SDK user should not be making any decisions about microversions- they should be using SDK calls that have behaviors.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        self._action("},{"line_number":412,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _live_migrate(self, session, host, force, block_migration):"},{"line_number":415,"context_line":"        microversion \u003d None"},{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_4e55d31d","line":414,"updated":"2018-06-28 19:44:28.000000000","message":"Hmm, isn\u0027t disk_over_commit required, at least \u003c2.25? Yes it is:\n\nhttps://github.com/openstack/nova/blob/f5d0d85285c894b48c463e3b72646537db90514d/nova/api/openstack/compute/schemas/migrate_server.py#L48","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        self._action("},{"line_number":412,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _live_migrate(self, session, host, force, block_migration):"},{"line_number":415,"context_line":"        microversion \u003d None"},{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a2791b83","line":414,"range":{"start_line":414,"start_character":43,"end_line":414,"end_character":48},"updated":"2018-06-28 19:44:28.000000000","message":"There is no force parameter for live migration before 2.30.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        self._action("},{"line_number":412,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _live_migrate(self, session, host, force, block_migration):"},{"line_number":415,"context_line":"        microversion \u003d None"},{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_c541c10c","line":414,"range":{"start_line":414,"start_character":43,"end_line":414,"end_character":48},"in_reply_to":"5f7c97a3_a2791b83","updated":"2018-06-28 21:00:13.000000000","message":"Yeah - same thing with force - we need the value here to be able to throw the safety error. Good point with disk_over_commit though - I\u0027m guessing \"False\" is the safer default?","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62aaf1bc20f5a06740bf1f3bc6bf12ea33192a85","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        self._action("},{"line_number":412,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _live_migrate(self, session, host, force, block_migration):"},{"line_number":415,"context_line":"        microversion \u003d None"},{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_dc309c09","line":414,"range":{"start_line":414,"start_character":43,"end_line":414,"end_character":48},"in_reply_to":"5f7c97a3_c541c10c","updated":"2018-06-30 12:12:30.000000000","message":"\u003e Good point with disk_over_commit though - I\u0027m guessing \"False\" is the safer default?\n\nYup, and that\u0027s what novaclient uses for the default.\n\nhttps://github.com/openstack/python-novaclient/blob/910328c30dbdd2495730bef719a29c72d313eb7a/novaclient/v2/servers.py#L421","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":414,"context_line":"    def _live_migrate(self, session, host, force, block_migration):"},{"line_number":415,"context_line":"        microversion \u003d None"},{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"},{"line_number":418,"context_line":"            block_migration \u003d True"},{"line_number":419,"context_line":"        if block_migration is not None:"},{"line_number":420,"context_line":"            body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":421,"context_line":"        if host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_62aa23d4","line":418,"range":{"start_line":417,"start_character":8,"end_line":418,"end_character":34},"updated":"2018-06-28 19:44:28.000000000","message":"Hmm, I\u0027d say if a host is specified but block_migration isn\u0027t, the user should have to provide it, otherwise default to False like in novaclient.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":414,"context_line":"    def _live_migrate(self, session, host, force, block_migration):"},{"line_number":415,"context_line":"        microversion \u003d None"},{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"},{"line_number":418,"context_line":"            block_migration \u003d True"},{"line_number":419,"context_line":"        if block_migration is not None:"},{"line_number":420,"context_line":"            body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":421,"context_line":"        if host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_856c299e","line":418,"range":{"start_line":417,"start_character":8,"end_line":418,"end_character":34},"in_reply_to":"5f7c97a3_62aa23d4","updated":"2018-06-28 21:00:13.000000000","message":"I think default to false would be better - otherwise the sdk api is different for different nova versions.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"},{"line_number":418,"context_line":"            block_migration \u003d True"},{"line_number":419,"context_line":"        if block_migration is not None:"},{"line_number":420,"context_line":"            body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":421,"context_line":"        if host:"},{"line_number":422,"context_line":"            body[\u0027host\u0027] \u003d host"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_42b12744","line":419,"updated":"2018-06-28 19:44:28.000000000","message":"If block_migration is None and host is None, you\u0027re not adding block_migration to the body and the server will reject it - I\u0027d default to False in that case to mirror novaclient.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        body \u003d {}"},{"line_number":417,"context_line":"        if block_migration is None and host:"},{"line_number":418,"context_line":"            block_migration \u003d True"},{"line_number":419,"context_line":"        if block_migration is not None:"},{"line_number":420,"context_line":"            body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":421,"context_line":"        if host:"},{"line_number":422,"context_line":"            body[\u0027host\u0027] \u003d host"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_456611be","line":419,"in_reply_to":"5f7c97a3_42b12744","updated":"2018-06-28 21:00:13.000000000","message":"Done","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e693195c219fc83780008894aa33aae5cc52e70e","unresolved":false,"context_lines":[{"line_number":418,"context_line":"            block_migration \u003d True"},{"line_number":419,"context_line":"        if block_migration is not None:"},{"line_number":420,"context_line":"            body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":421,"context_line":"        if host:"},{"line_number":422,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":423,"context_line":"            if not force:"},{"line_number":424,"context_line":"                raise ValueError("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_424da739","line":421,"updated":"2018-06-28 19:48:35.000000000","message":"So, it\u0027s dumb, but \u0027host\u0027 is required in the body even if you just specify None to let the scheduler pick one. So you need the host key in all 3 of these method\u0027s request bodies.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":418,"context_line":"            block_migration \u003d True"},{"line_number":419,"context_line":"        if block_migration is not None:"},{"line_number":420,"context_line":"            body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":421,"context_line":"        if host:"},{"line_number":422,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":423,"context_line":"            if not force:"},{"line_number":424,"context_line":"                raise ValueError("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a50a85ce","line":421,"in_reply_to":"5f7c97a3_424da739","updated":"2018-06-28 21:00:13.000000000","message":"AWESOME.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                    \"Live migration before microversion 2.30 implies \u0027force\u0027\""},{"line_number":426,"context_line":"                    \" if the \u0027host\u0027 option has been given and it is not\""},{"line_number":427,"context_line":"                    \" possible to disable. It is recommended to not use \u0027host\u0027\""},{"line_number":428,"context_line":"                    \" at all, but if it is unavoidable, please supply\""},{"line_number":429,"context_line":"                    \" \u0027force\u003dTrue\u0027\")"},{"line_number":430,"context_line":"        self._action("},{"line_number":431,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":432,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_e2fab30f","line":429,"range":{"start_line":428,"start_character":56,"end_line":429,"end_character":34},"updated":"2018-06-28 19:44:28.000000000","message":"This isn\u0027t what I\u0027d recommend, I\u0027d say if you need to specify host, don\u0027t use force but instead request with microversion \u003e\u003d 2.30 to validate the host in the scheduler.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                    \"Live migration before microversion 2.30 implies \u0027force\u0027\""},{"line_number":426,"context_line":"                    \" if the \u0027host\u0027 option has been given and it is not\""},{"line_number":427,"context_line":"                    \" possible to disable. It is recommended to not use \u0027host\u0027\""},{"line_number":428,"context_line":"                    \" at all, but if it is unavoidable, please supply\""},{"line_number":429,"context_line":"                    \" \u0027force\u003dTrue\u0027\")"},{"line_number":430,"context_line":"        self._action("},{"line_number":431,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":432,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_851ae915","line":429,"range":{"start_line":428,"start_character":56,"end_line":429,"end_character":34},"in_reply_to":"5f7c97a3_e2fab30f","updated":"2018-06-28 21:00:13.000000000","message":"If they get to this part of logic, they do not have 2.30 available in their cloud.","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":387,"context_line":"            block_migration \u003d \u0027auto\u0027"},{"line_number":388,"context_line":"        body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":389,"context_line":"        if host:"},{"line_number":390,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":391,"context_line":"            if force:"},{"line_number":392,"context_line":"                body[\u0027force\u0027] \u003d force"},{"line_number":393,"context_line":"        self._action("},{"line_number":394,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_1c2614cd","line":392,"range":{"start_line":390,"start_character":12,"end_line":392,"end_character":37},"updated":"2018-06-30 12:26:59.000000000","message":"Ah OK so you can specify a host to be validated by the scheduler w/o forcing it if \u003e\u003d 2.30, good.","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        if host:"},{"line_number":403,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":404,"context_line":"            if not force:"},{"line_number":405,"context_line":"                raise ValueError("},{"line_number":406,"context_line":"                    \"Live migration on this cloud implies \u0027force\u0027\""},{"line_number":407,"context_line":"                    \" if the \u0027host\u0027 option has been given and it is not\""},{"line_number":408,"context_line":"                    \" possible to disable. It is recommended to not use \u0027host\u0027\""},{"line_number":409,"context_line":"                    \" at all on this cloud as it is inherently unsafe, but if\""},{"line_number":410,"context_line":"                    \" it is unavoidable, please supply \u0027force\u003dTrue\u0027 so that it\""},{"line_number":411,"context_line":"                    \" is clear you understand the risks.\")"},{"line_number":412,"context_line":"        self._action("},{"line_number":413,"context_line":"            session, {\u0027os-migrateLive\u0027: body}, microversion\u003dmicroversion)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_dc197c87","line":411,"range":{"start_line":405,"start_character":16,"end_line":411,"end_character":58},"updated":"2018-06-30 12:26:59.000000000","message":"++ makes sense to me now","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":424,"context_line":"            raise ValueError("},{"line_number":425,"context_line":"                \"Live migration on this cloud does not support \u0027auto\u0027 as\""},{"line_number":426,"context_line":"                \" a parameter to block_migration, but only True and False.\")"},{"line_number":427,"context_line":"        elif block_migration is None and host:"},{"line_number":428,"context_line":"            block_migration \u003d False"},{"line_number":429,"context_line":"        body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":430,"context_line":"        if host:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_9c130466","line":427,"range":{"start_line":427,"start_character":36,"end_line":427,"end_character":45},"updated":"2018-06-30 12:26:59.000000000","message":"I\u0027m not sure if we need this in the condition. I think you probably added it from previous discussion, i.e. if the user specified a host, make them also specify block_migration since they should know if the host is on shared storage or not. I guess if they pass block_migration\u003dNone and host !\u003d None, they\u0027ll get an error from the API saying block_migration is required. Or would you want to raise a more useful ValueError here immediately?","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cafbae667065fe9f874c7ca609afd0287e319c01","unresolved":false,"context_lines":[{"line_number":424,"context_line":"            raise ValueError("},{"line_number":425,"context_line":"                \"Live migration on this cloud does not support \u0027auto\u0027 as\""},{"line_number":426,"context_line":"                \" a parameter to block_migration, but only True and False.\")"},{"line_number":427,"context_line":"        body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":428,"context_line":"        if host:"},{"line_number":429,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":430,"context_line":"            if not force:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_44b57ccf","line":427,"updated":"2018-07-02 16:39:53.000000000","message":"In PS6 you had this:\n\nelif block_migration is None and host:\n            block_migration \u003d False\n\nAnd I lobbied to remove the \"and host\" from the condition. _live_migrate_30 and _live_migrate_25 both handle a default if block_migration is None - I think you likely want the same default condition from PS6 sans the \u0027and host\u0027 part, so just:\n\n    elif block_migration is None:\n        block_migration \u003d False\n\nSo \u003c2.25 gets block_migration\u003dFalse by default.","commit_id":"593b17a57a66899e642e52d122b4ec782eec5d46"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"57a9645734e2f08fbef81e9c40e36d1014254cc3","unresolved":false,"context_lines":[{"line_number":424,"context_line":"            raise ValueError("},{"line_number":425,"context_line":"                \"Live migration on this cloud does not support \u0027auto\u0027 as\""},{"line_number":426,"context_line":"                \" a parameter to block_migration, but only True and False.\")"},{"line_number":427,"context_line":"        body[\u0027block_migration\u0027] \u003d block_migration"},{"line_number":428,"context_line":"        if host:"},{"line_number":429,"context_line":"            body[\u0027host\u0027] \u003d host"},{"line_number":430,"context_line":"            if not force:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_042e8eaa","line":427,"in_reply_to":"5f7c97a3_44b57ccf","updated":"2018-07-03 13:37:35.000000000","message":"Ah - good point. Done.","commit_id":"593b17a57a66899e642e52d122b4ec782eec5d46"}],"openstack/tests/unit/compute/v2/test_server.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":663,"context_line":"            max_microversion \u003d None"},{"line_number":664,"context_line":"        self.sess.get_endpoint_data.return_value \u003d FakeEndpointData()"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        self.assertRaises("},{"line_number":667,"context_line":"            ValueError,"},{"line_number":668,"context_line":"            sot.live_migrate,"},{"line_number":669,"context_line":"            self.sess, host\u003d\u0027HOST2\u0027, force\u003dFalse, block_migration\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_3c0af026","line":666,"updated":"2018-06-30 12:26:59.000000000","message":"nit: normally on something like this with a generic exception like ValueError I\u0027d trap the exception and assert something in the message to make sure it\u0027s what you expect, e.g.:\n\nex \u003d self.assertRaises(ValueError, ...)\nself.assertIn(\"Live migration on this cloud implies \u0027force\u0027\", six.text_type(ex))\n\nThat way if there is a code bug that raises ValueError we\u0027ll catch it here.","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b4b4d47009f30a9b2756f1a27f757f015cb9255f","unresolved":false,"context_lines":[{"line_number":663,"context_line":"            max_microversion \u003d None"},{"line_number":664,"context_line":"        self.sess.get_endpoint_data.return_value \u003d FakeEndpointData()"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        self.assertRaises("},{"line_number":667,"context_line":"            ValueError,"},{"line_number":668,"context_line":"            sot.live_migrate,"},{"line_number":669,"context_line":"            self.sess, host\u003d\u0027HOST2\u0027, force\u003dFalse, block_migration\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_08523c69","line":666,"in_reply_to":"5f7c97a3_3c0af026","updated":"2018-07-02 13:52:13.000000000","message":"Done","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        self.assertIsNone(res)"},{"line_number":683,"context_line":"        url \u003d \u0027servers/IDENTIFIER/action\u0027"},{"line_number":684,"context_line":"        body \u003d {"},{"line_number":685,"context_line":"            \u0027os-migrateLive\u0027: {"},{"line_number":686,"context_line":"                \u0027host\u0027: \u0027HOST2\u0027,"},{"line_number":687,"context_line":"                \u0027disk_over_commit\u0027: False,"},{"line_number":688,"context_line":"                \u0027block_migration\u0027: False"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_fc03180f","line":685,"updated":"2018-06-30 12:26:59.000000000","message":"OK no force parameter in the API request even though force\u003dTrue in the SDK call because microversion not specified so 2.1 is implied. Got it. Might be worth a comment in the test or a docstring to describe the test itself. Or rename the test: test_live_migrate_no_microversion_force_true.","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b4b4d47009f30a9b2756f1a27f757f015cb9255f","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        self.assertIsNone(res)"},{"line_number":683,"context_line":"        url \u003d \u0027servers/IDENTIFIER/action\u0027"},{"line_number":684,"context_line":"        body \u003d {"},{"line_number":685,"context_line":"            \u0027os-migrateLive\u0027: {"},{"line_number":686,"context_line":"                \u0027host\u0027: \u0027HOST2\u0027,"},{"line_number":687,"context_line":"                \u0027disk_over_commit\u0027: False,"},{"line_number":688,"context_line":"                \u0027block_migration\u0027: False"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_685bb085","line":685,"in_reply_to":"5f7c97a3_fc03180f","updated":"2018-07-02 13:52:13.000000000","message":"Done","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":702,"context_line":"        self.sess.get_endpoint_data.return_value \u003d FakeEndpointData()"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        res \u003d sot.live_migrate("},{"line_number":705,"context_line":"            self.sess, host\u003d\u0027HOST2\u0027, force\u003dTrue, block_migration\u003dFalse)"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"        self.assertIsNone(res)"},{"line_number":708,"context_line":"        url \u003d \u0027servers/IDENTIFIER/action\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_1cfff402","line":705,"range":{"start_line":705,"start_character":65,"end_line":705,"end_character":70},"updated":"2018-06-30 12:26:59.000000000","message":"nit: a nice wrinkle here would be to pass None and see it default to \u0027auto\u0027 since I don\u0027t think you have anything covering that default mode yet.","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b4b4d47009f30a9b2756f1a27f757f015cb9255f","unresolved":false,"context_lines":[{"line_number":702,"context_line":"        self.sess.get_endpoint_data.return_value \u003d FakeEndpointData()"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        res \u003d sot.live_migrate("},{"line_number":705,"context_line":"            self.sess, host\u003d\u0027HOST2\u0027, force\u003dTrue, block_migration\u003dFalse)"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"        self.assertIsNone(res)"},{"line_number":708,"context_line":"        url \u003d \u0027servers/IDENTIFIER/action\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_a8ef8884","line":705,"range":{"start_line":705,"start_character":65,"end_line":705,"end_character":70},"in_reply_to":"5f7c97a3_1cfff402","updated":"2018-07-02 13:52:13.000000000","message":"Done","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":726,"context_line":"        self.sess.get_endpoint_data.return_value \u003d FakeEndpointData()"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"        res \u003d sot.live_migrate("},{"line_number":729,"context_line":"            self.sess, host\u003d\u0027HOST2\u0027, force\u003dFalse, block_migration\u003dFalse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        self.assertIsNone(res)"},{"line_number":732,"context_line":"        url \u003d \u0027servers/IDENTIFIER/action\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_dffe4e03","line":729,"range":{"start_line":729,"start_character":43,"end_line":729,"end_character":48},"updated":"2018-06-30 12:26:59.000000000","message":"nit: I\u0027d add one more test for \u003e\u003d 2.30 where force\u003dTrue to see that force\u003dTrue in the API request - since you don\u0027t have a test for that yet and force isn\u0027t a parameter in the API request if \u003c 2.30.","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b4b4d47009f30a9b2756f1a27f757f015cb9255f","unresolved":false,"context_lines":[{"line_number":726,"context_line":"        self.sess.get_endpoint_data.return_value \u003d FakeEndpointData()"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"        res \u003d sot.live_migrate("},{"line_number":729,"context_line":"            self.sess, host\u003d\u0027HOST2\u0027, force\u003dFalse, block_migration\u003dFalse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        self.assertIsNone(res)"},{"line_number":732,"context_line":"        url \u003d \u0027servers/IDENTIFIER/action\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_e8db40e7","line":729,"range":{"start_line":729,"start_character":43,"end_line":729,"end_character":48},"in_reply_to":"5f7c97a3_dffe4e03","updated":"2018-07-02 13:52:13.000000000","message":"Done","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"}],"openstack/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff95f6126f9f9f54678c3900ffb778a503bf1bae","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        return keys"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"def supports_microversion(adapter, microversion):"},{"line_number":135,"context_line":"    endpoint_data \u003d adapter.get_endpoint_data()"},{"line_number":136,"context_line":"    if discover.version_between("},{"line_number":137,"context_line":"            endpoint_data.min_microversion,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_22466b52","line":134,"updated":"2018-06-28 19:44:28.000000000","message":"docstring on this would be nice, since I think it means, \"check if the specified version is between the servers min and max available versions\", but it\u0027s not immediately obvious","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3ab8c6801a2579217f8e6513db41ec5dbb5a5d64","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        return keys"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"def supports_microversion(adapter, microversion):"},{"line_number":135,"context_line":"    endpoint_data \u003d adapter.get_endpoint_data()"},{"line_number":136,"context_line":"    if discover.version_between("},{"line_number":137,"context_line":"            endpoint_data.min_microversion,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_c5dd4142","line":134,"in_reply_to":"5f7c97a3_22466b52","updated":"2018-06-28 21:00:13.000000000","message":"Oh - totally. I *actually* think this should be in keystoneauth ...","commit_id":"b4f7b1345e80607616209f95881142be906c3584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02c053a2f07d68eed6b9fa33e89364a35eb14d89","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    \"\"\"Determine if the given adapter supports the given microversion."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    Checks the min and max microversion asserted by the service and checks"},{"line_number":138,"context_line":"    to make sure that ``min \u003c\u003d microversion \u003c max``."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    :param adapter:"},{"line_number":141,"context_line":"        :class:`~keystoneauth1.adapter.Adapter` instance."}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_7f05ba0f","line":138,"range":{"start_line":138,"start_character":44,"end_line":138,"end_character":45},"updated":"2018-06-30 12:26:59.000000000","message":"This is \u003c or \u003c\u003d? Because your 2.30 test would fail if you passed 2.30 and the max was 2.30 if it\u0027s really \u003c.","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b4b4d47009f30a9b2756f1a27f757f015cb9255f","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    \"\"\"Determine if the given adapter supports the given microversion."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    Checks the min and max microversion asserted by the service and checks"},{"line_number":138,"context_line":"    to make sure that ``min \u003c\u003d microversion \u003c max``."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    :param adapter:"},{"line_number":141,"context_line":"        :class:`~keystoneauth1.adapter.Adapter` instance."}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_0821dcb5","line":138,"range":{"start_line":138,"start_character":44,"end_line":138,"end_character":45},"in_reply_to":"5f7c97a3_7f05ba0f","updated":"2018-07-02 13:52:13.000000000","message":"Done","commit_id":"9f3391a375699cfd2ac3cd0b01a379630288d589"}]}
