)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9592b861b09e64b67d16bf4a1bb1f619a173dbef","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This patch extends the migrate_instance_finish() network api method to"},{"line_number":16,"context_line":"pass the updated resource providers of the ports during migration."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I220fa02ee916728e241503084b14984bab4b0c3b"},{"line_number":19,"context_line":"blueprint: support-move-ops-with-qos-ports"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"7faddb67_51694abb","line":17,"updated":"2019-09-05 14:06:37.000000000","message":"nit: if you respin you could add something to the effect of subsequent changes will add minimum nova-compute service version validation in the control plane to ensure a migration is not started for servers that have ports with resource requests before the source and destination compute are upgraded.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d134dae16b57096722bdf1095845c5a94395c930","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This patch extends the migrate_instance_finish() network api method to"},{"line_number":16,"context_line":"pass the updated resource providers of the ports during migration."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I220fa02ee916728e241503084b14984bab4b0c3b"},{"line_number":19,"context_line":"blueprint: support-move-ops-with-qos-ports"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"5faad753_aebef6fc","line":17,"in_reply_to":"7faddb67_51694abb","updated":"2019-09-06 07:41:50.000000000","message":"I\u0027m cool with that.\nI need also to make sure we properly document the resize behaviour when the controlplane isn\u0027t fully upgraded in a reno note and potentially other places as it could be confusing.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"}],"nova/compute/manager.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6eec1cfd0cdee5f04fd0d6f3535fa81bf91ba6c","unresolved":false,"context_lines":[{"line_number":4213,"context_line":""},{"line_number":4214,"context_line":"    def _finish_revert_resize_network_migrate_finish("},{"line_number":4215,"context_line":"            self, context, instance, migration,"},{"line_number":4216,"context_line":"            request_group_resource_providers_mapping):"},{"line_number":4217,"context_line":"        \"\"\"Causes port binding to be updated. In some Neutron or port"},{"line_number":4218,"context_line":"        configurations - see NetworkModel.get_bind_time_events() - we"},{"line_number":4219,"context_line":"        expect the vif-plugged event from Neutron immediately and wait for it."}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_ff29ce36","line":4216,"range":{"start_line":4216,"start_character":12,"end_line":4216,"end_character":52},"updated":"2019-08-26 14:07:20.000000000","message":"this is kind of long\n\nwhy not jsut call it provider_mappings\n\nalso the s shoudl be applied to mappings not providers","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8bd9620c28acca04af2f62f93e0667dd0f5467a8","unresolved":false,"context_lines":[{"line_number":4213,"context_line":""},{"line_number":4214,"context_line":"    def _finish_revert_resize_network_migrate_finish("},{"line_number":4215,"context_line":"            self, context, instance, migration,"},{"line_number":4216,"context_line":"            request_group_resource_providers_mapping):"},{"line_number":4217,"context_line":"        \"\"\"Causes port binding to be updated. In some Neutron or port"},{"line_number":4218,"context_line":"        configurations - see NetworkModel.get_bind_time_events() - we"},{"line_number":4219,"context_line":"        expect the vif-plugged event from Neutron immediately and wait for it."}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_eb601ed2","line":4216,"range":{"start_line":4216,"start_character":12,"end_line":4216,"end_character":52},"in_reply_to":"7faddb67_ff29ce36","updated":"2019-08-27 12:04:26.000000000","message":"renamed to provider_mappings.","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6eec1cfd0cdee5f04fd0d6f3535fa81bf91ba6c","unresolved":false,"context_lines":[{"line_number":4303,"context_line":"                           \u0027migration_uuid\u0027: migration.uuid})"},{"line_number":4304,"context_line":"                raise"},{"line_number":4305,"context_line":""},{"line_number":4306,"context_line":"            request_group_resource_providers_mapping \u003d \\"},{"line_number":4307,"context_line":"                self._get_request_group_mapping(request_spec)"},{"line_number":4308,"context_line":""},{"line_number":4309,"context_line":"            self.network_api.setup_networks_on_host(context, instance,"},{"line_number":4310,"context_line":"                                                    migration.source_compute)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_9fcc5a8b","line":4307,"range":{"start_line":4306,"start_character":16,"end_line":4307,"end_character":61},"updated":"2019-08-26 14:07:20.000000000","message":"you might be able to fit this on one line with the variabel rename.\n\n_get_request_group_mapping shoudl also be _get_request_group_mappings","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8bd9620c28acca04af2f62f93e0667dd0f5467a8","unresolved":false,"context_lines":[{"line_number":4303,"context_line":"                           \u0027migration_uuid\u0027: migration.uuid})"},{"line_number":4304,"context_line":"                raise"},{"line_number":4305,"context_line":""},{"line_number":4306,"context_line":"            request_group_resource_providers_mapping \u003d \\"},{"line_number":4307,"context_line":"                self._get_request_group_mapping(request_spec)"},{"line_number":4308,"context_line":""},{"line_number":4309,"context_line":"            self.network_api.setup_networks_on_host(context, instance,"},{"line_number":4310,"context_line":"                                                    migration.source_compute)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_8ba5ea05","line":4307,"range":{"start_line":4306,"start_character":16,"end_line":4307,"end_character":61},"in_reply_to":"7faddb67_9fcc5a8b","updated":"2019-08-27 12:04:26.000000000","message":"Done","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6eec1cfd0cdee5f04fd0d6f3535fa81bf91ba6c","unresolved":false,"context_lines":[{"line_number":4310,"context_line":"                                                    migration.source_compute)"},{"line_number":4311,"context_line":"            self._finish_revert_resize_network_migrate_finish("},{"line_number":4312,"context_line":"                context, instance, migration,"},{"line_number":4313,"context_line":"                request_group_resource_providers_mapping)"},{"line_number":4314,"context_line":"            network_info \u003d self.network_api.get_instance_nw_info(context,"},{"line_number":4315,"context_line":"                                                                 instance)"},{"line_number":4316,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_7fc39e58","line":4313,"range":{"start_line":4313,"start_character":16,"end_line":4313,"end_character":56},"updated":"2019-08-26 14:07:20.000000000","message":"that said you dont actully use tehm in this function so you could just call _get_request_group_mappings() here","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8bd9620c28acca04af2f62f93e0667dd0f5467a8","unresolved":false,"context_lines":[{"line_number":4310,"context_line":"                                                    migration.source_compute)"},{"line_number":4311,"context_line":"            self._finish_revert_resize_network_migrate_finish("},{"line_number":4312,"context_line":"                context, instance, migration,"},{"line_number":4313,"context_line":"                request_group_resource_providers_mapping)"},{"line_number":4314,"context_line":"            network_info \u003d self.network_api.get_instance_nw_info(context,"},{"line_number":4315,"context_line":"                                                                 instance)"},{"line_number":4316,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_4b3932cd","line":4313,"range":{"start_line":4313,"start_character":16,"end_line":4313,"end_character":56},"in_reply_to":"7faddb67_7fc39e58","updated":"2019-08-27 12:04:26.000000000","message":"If I want to call _get_request_group_mappings here then I have to pass request_spec. So it is anyhow passing one extra argument to this function.","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6eec1cfd0cdee5f04fd0d6f3535fa81bf91ba6c","unresolved":false,"context_lines":[{"line_number":4787,"context_line":"        # NOTE(tr3buchet): setup networks on destination host"},{"line_number":4788,"context_line":"        self.network_api.setup_networks_on_host(context, instance,"},{"line_number":4789,"context_line":"                                                migration.dest_compute)"},{"line_number":4790,"context_line":"        request_group_resource_providers_mapping \u003d \\"},{"line_number":4791,"context_line":"            self._get_request_group_mapping(request_spec)"},{"line_number":4792,"context_line":""},{"line_number":4793,"context_line":"        # For neutron, migrate_instance_finish updates port bindings for this"},{"line_number":4794,"context_line":"        # host including any PCI devices claimed for SR-IOV ports."},{"line_number":4795,"context_line":"        self.network_api.migrate_instance_finish("},{"line_number":4796,"context_line":"            context, instance, migration,"},{"line_number":4797,"context_line":"            request_group_resource_providers_mapping)"},{"line_number":4798,"context_line":""},{"line_number":4799,"context_line":"        network_info \u003d self.network_api.get_instance_nw_info(context, instance)"},{"line_number":4800,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_df8092fa","line":4797,"range":{"start_line":4790,"start_character":5,"end_line":4797,"end_character":53},"updated":"2019-08-26 14:07:20.000000000","message":"same as above you could just call\n_get_request_group_mapping(request_spec) inline\nfailing that i think you shoudl rename this to something shorter.","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8bd9620c28acca04af2f62f93e0667dd0f5467a8","unresolved":false,"context_lines":[{"line_number":4787,"context_line":"        # NOTE(tr3buchet): setup networks on destination host"},{"line_number":4788,"context_line":"        self.network_api.setup_networks_on_host(context, instance,"},{"line_number":4789,"context_line":"                                                migration.dest_compute)"},{"line_number":4790,"context_line":"        request_group_resource_providers_mapping \u003d \\"},{"line_number":4791,"context_line":"            self._get_request_group_mapping(request_spec)"},{"line_number":4792,"context_line":""},{"line_number":4793,"context_line":"        # For neutron, migrate_instance_finish updates port bindings for this"},{"line_number":4794,"context_line":"        # host including any PCI devices claimed for SR-IOV ports."},{"line_number":4795,"context_line":"        self.network_api.migrate_instance_finish("},{"line_number":4796,"context_line":"            context, instance, migration,"},{"line_number":4797,"context_line":"            request_group_resource_providers_mapping)"},{"line_number":4798,"context_line":""},{"line_number":4799,"context_line":"        network_info \u003d self.network_api.get_instance_nw_info(context, instance)"},{"line_number":4800,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_eb47be4b","line":4797,"range":{"start_line":4790,"start_character":5,"end_line":4797,"end_character":53},"in_reply_to":"7faddb67_df8092fa","updated":"2019-08-27 12:04:26.000000000","message":"Here also would need to pass request_spec if I want to call _get_request_group_mappings inline.","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21a7b1a398fe47bb9008a7bcd1c79173aa6ed1e7","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_2214ac40","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"updated":"2019-09-03 15:56:20.000000000","message":"OK so in the case that compute RPC is pinned to Stein and the RequestSpec does not get passed to finish_resize or finish_revert_resize we\u0027ll handle the RequestSpec being None here and just return None. Will migrate_instance_finish handle there being no provider mappings? Looks like it won\u0027t.\n\nThe spec talks about this:\n\nhttp://specs.openstack.org/openstack/nova-specs/specs/train/approved/support-move-ops-with-qos-ports.html#upgrade-impact\n\n\"The nova-compute needs to check if the instance has ports that would require mapping and if the RequestSpec is not provided in the call then fail the operation.\"\n\nIs that sanity check somewhere else in the series or should it be in this patch? I would expect something that validates if there is no request spec but the instance has ports in the instance network info cache with a port binding profile with an allocation set, we should fail since we\u0027ll drop those allocations due to the move operation.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c5ee880a996208682fe0838f7f9a2438c7d52c3b","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_47176ca4","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"in_reply_to":"7faddb67_2214ac40","updated":"2019-09-04 09:44:38.000000000","message":"Good catch.\n\nAs far as I see migration with bandwidth can only work if both the source and the destination compute is at least on Train level. \n\nThis means we need a service level check to reject the migration if the compute services are \u003c level 39.\n\nDo you agree?","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c1fb455d1c706c9f1a8227b674633990a965cc9","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_08318059","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"in_reply_to":"7faddb67_47176ca4","updated":"2019-09-04 13:17:19.000000000","message":"\u003e This means we need a service level check to reject the migration if the compute services are \u003c level 39.\n\nYeah probably at a minimum. Something that came up in Artom\u0027s NUMA live migration series yesterday was that the services could be upgraded but RPC could be pinned to a lower version on them during an upgrade meaning they might not pass the RequestSpec around, so there is still a chance that we might not have a RequestSpec in the computes, at least during an upgrade to Train.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b3fc56d268fa1e35dc5e495d38c5571461834293","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_ada2c198","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"in_reply_to":"7faddb67_47176ca4","updated":"2019-09-04 10:05:38.000000000","message":"Where to put that check?\n\nCurrently MigratonTask is called synchronously from the API so we could check in the conductor BUT cross cell resize make that call async so I guess it is more future proof to do that check in the api.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"de1d4cb2a74b802a217efa27955ca2a8ae3612d4","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_ef3663b4","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"in_reply_to":"7faddb67_a8462ca6","updated":"2019-09-04 18:23:31.000000000","message":"From our IRC conversation it sounds like you plan on:\n\n1. Checking the source compute service version in the API to fail fast if it\u0027s not new enough.\n\n2. Check the selected destination compute in conductor and if it\u0027s not new enough iterate the alternates in conductor - if none work then raise MaxRetriesExceeded.\n\n3. We likely still need a check in compute here for the reason I mentioned above; the computes could be upgraded but still pinned in config until they are unpinned and restarted. I think that could be removed in U.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c1fb455d1c706c9f1a8227b674633990a965cc9","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_a8462ca6","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"in_reply_to":"7faddb67_ada2c198","updated":"2019-09-04 13:17:19.000000000","message":"\u003e Where to put that check?\n \u003e \n \u003e Currently MigratonTask is called synchronously from the API so we\n \u003e could check in the conductor BUT cross cell resize make that call\n \u003e async so I guess it is more future proof to do that check in the\n \u003e api.\n\nAPI or conductor is probably sufficient. We have checks like that in the LiveMigrationTask in conductor already:\n\nhttps://github.com/openstack/nova/blob/cbaea3bd690c683e83a063acfa69919668eaa123/nova/conductor/tasks/live_migrate.py#L35-L58\n\nActually you have to do it in conductor because that\u0027s where we get the destination host.\n\nBut we likely also need a check in compute (which can be removed in Ussuri) where we check if the instance info cache has any allocations in the binding:profile and if so, and the RequestSpec is not provided, we fail the migration.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0d9f9b9729f7104c819694ca008fb8ab2816d74b","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_88e2502f","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"in_reply_to":"7faddb67_ada2c198","updated":"2019-09-05 12:54:33.000000000","message":"Added the min compute service version check in separate patch.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0d9f9b9729f7104c819694ca008fb8ab2816d74b","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        RequestGroup."},{"line_number":2120,"context_line":"        \"\"\""},{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"        if (request_spec and"},{"line_number":2123,"context_line":"                \u0027requested_resources\u0027 in request_spec and"},{"line_number":2124,"context_line":"                request_spec.requested_resources is not None):"},{"line_number":2125,"context_line":"            return {"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_cbd26934","line":2122,"range":{"start_line":2122,"start_character":8,"end_line":2122,"end_character":28},"in_reply_to":"7faddb67_ef3663b4","updated":"2019-09-05 12:54:33.000000000","message":"\u003e From our IRC conversation it sounds like you plan on:\n \u003e \n \u003e 1. Checking the source compute service version in the API to fail\n \u003e fast if it\u0027s not new enough.\n\nImplemented in:\n* cold migrate: https://review.opendev.org/#/c/680395\n* resize: https://review.opendev.org/#/c/680396\n\n \u003e \n \u003e 2. Check the selected destination compute in conductor and if it\u0027s\n \u003e not new enough iterate the alternates in conductor - if none work\n \u003e then raise MaxRetriesExceeded.\n\nImplemented in: https://review.opendev.org/#/c/680394\n\n \u003e \n \u003e 3. We likely still need a check in compute here for the reason I\n \u003e mentioned above; the computes could be upgraded but still pinned in\n \u003e config until they are unpinned and restarted. I think that could be\n \u003e removed in U.\n\nI added a check in _update_port_binding_for_instance [1]. It will fail the binding (and therefore fail the resize / migrate) if there is port with resource request but no port_mapping. This is not exactly what we discussed for the pinned case. But I think it handles the pinning case well enough without depending on the info_cache.\n\n[1] https://review.opendev.org/#/c/656422/18..20/nova/network/neutronv2/api.py@3290","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21a7b1a398fe47bb9008a7bcd1c79173aa6ed1e7","unresolved":false,"context_lines":[{"line_number":4214,"context_line":"        :param context: The request context."},{"line_number":4215,"context_line":"        :param instance: The instance undergoing the revert resize."},{"line_number":4216,"context_line":"        :param migration: The Migration object of the resize being reverted."},{"line_number":4217,"context_line":"        :param provider_mappings: a dict of list of rp uuids keyed by port uuid"},{"line_number":4218,"context_line":"        :raises: eventlet.timeout.Timeout or"},{"line_number":4219,"context_line":"                 exception.VirtualInterfacePlugException."},{"line_number":4220,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_4249a82f","line":4217,"range":{"start_line":4217,"start_character":52,"end_line":4217,"end_character":54},"updated":"2019-09-03 15:56:20.000000000","message":"nit: resource provider","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0d9f9b9729f7104c819694ca008fb8ab2816d74b","unresolved":false,"context_lines":[{"line_number":4214,"context_line":"        :param context: The request context."},{"line_number":4215,"context_line":"        :param instance: The instance undergoing the revert resize."},{"line_number":4216,"context_line":"        :param migration: The Migration object of the resize being reverted."},{"line_number":4217,"context_line":"        :param provider_mappings: a dict of list of rp uuids keyed by port uuid"},{"line_number":4218,"context_line":"        :raises: eventlet.timeout.Timeout or"},{"line_number":4219,"context_line":"                 exception.VirtualInterfacePlugException."},{"line_number":4220,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_287d5c6c","line":4217,"range":{"start_line":4217,"start_character":52,"end_line":4217,"end_character":54},"in_reply_to":"7faddb67_4249a82f","updated":"2019-09-05 12:54:33.000000000","message":"Done","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d134dae16b57096722bdf1095845c5a94395c930","unresolved":false,"context_lines":[{"line_number":4293,"context_line":"                           \u0027migration_uuid\u0027: migration.uuid})"},{"line_number":4294,"context_line":"                raise"},{"line_number":4295,"context_line":""},{"line_number":4296,"context_line":"            provider_mappings \u003d self._get_request_group_mapping(request_spec)"},{"line_number":4297,"context_line":""},{"line_number":4298,"context_line":"            self.network_api.setup_networks_on_host(context, instance,"},{"line_number":4299,"context_line":"                                                    migration.source_compute)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_6e9a3ec6","line":4296,"updated":"2019-09-06 07:41:50.000000000","message":"Given the RequestSpec we pass down when we resize is actually having its flavor information updated, that works cool and we don\u0027t use the original flavor.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"}],"nova/network/api.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6eec1cfd0cdee5f04fd0d6f3535fa81bf91ba6c","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        self.network_rpcapi.migrate_instance_start(context, **args)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def migrate_instance_finish("},{"line_number":506,"context_line":"            self, context, instance, migration, resource_provider_mapping):"},{"line_number":507,"context_line":"        \"\"\"Finish migrating the network of an instance.\"\"\""},{"line_number":508,"context_line":"        flavor \u003d instance.get_flavor()"},{"line_number":509,"context_line":"        args \u003d dict("}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_bf9cb65b","line":506,"range":{"start_line":506,"start_character":48,"end_line":506,"end_character":73},"updated":"2019-08-26 14:07:20.000000000","message":"the same comment applie to the other case\nbut i would jsut make thei provider_mappings here and in the subsequent files","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8bd9620c28acca04af2f62f93e0667dd0f5467a8","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        self.network_rpcapi.migrate_instance_start(context, **args)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def migrate_instance_finish("},{"line_number":506,"context_line":"            self, context, instance, migration, resource_provider_mapping):"},{"line_number":507,"context_line":"        \"\"\"Finish migrating the network of an instance.\"\"\""},{"line_number":508,"context_line":"        flavor \u003d instance.get_flavor()"},{"line_number":509,"context_line":"        args \u003d dict("}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_4bd5b246","line":506,"range":{"start_line":506,"start_character":48,"end_line":506,"end_character":73},"in_reply_to":"7faddb67_bf9cb65b","updated":"2019-08-27 12:04:26.000000000","message":"Done","commit_id":"02641e539fcfdc53454dc4c195866d1d862dee81"}],"nova/network/base_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21a7b1a398fe47bb9008a7bcd1c79173aa6ed1e7","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        raise NotImplementedError()"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def migrate_instance_finish("},{"line_number":347,"context_line":"            self, context, instance, migration, provider_mappings):"},{"line_number":348,"context_line":"        \"\"\"Finish migrating the network of an instance.\"\"\""},{"line_number":349,"context_line":"        raise NotImplementedError()"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_222d8c8e","line":347,"range":{"start_line":347,"start_character":48,"end_line":347,"end_character":65},"updated":"2019-09-03 15:56:20.000000000","message":"Would be good to document the parameters to this method.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0d9f9b9729f7104c819694ca008fb8ab2816d74b","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        raise NotImplementedError()"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def migrate_instance_finish("},{"line_number":347,"context_line":"            self, context, instance, migration, provider_mappings):"},{"line_number":348,"context_line":"        \"\"\"Finish migrating the network of an instance.\"\"\""},{"line_number":349,"context_line":"        raise NotImplementedError()"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_080bc0d4","line":347,"range":{"start_line":347,"start_character":48,"end_line":347,"end_character":65},"in_reply_to":"7faddb67_222d8c8e","updated":"2019-09-05 12:54:33.000000000","message":"Done","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21a7b1a398fe47bb9008a7bcd1c79173aa6ed1e7","unresolved":false,"context_lines":[{"line_number":3293,"context_line":"                # numbered request group that is always fulfilled by one"},{"line_number":3294,"context_line":"                # resource provider. So we only pass that single RP UUID here."},{"line_number":3295,"context_line":"                binding_profile[constants.ALLOCATION] \u003d \\"},{"line_number":3296,"context_line":"                    provider_mappings[p[\u0027id\u0027]][0]"},{"line_number":3297,"context_line":"                updates[constants.BINDING_PROFILE] \u003d binding_profile"},{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"            port_updates.append((p[\u0027id\u0027], updates))"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_025e5012","line":3296,"range":{"start_line":3296,"start_character":20,"end_line":3296,"end_character":37},"updated":"2019-09-03 15:56:20.000000000","message":"This can be None if you have compute RPC pinnned which will lead to a NoneType error. This is actually always None for post_live_migration_at_destination so trying to live migrate an instance with port resource requests will always fail even if you have new computes. Although I guess you can\u0027t even initiate a live migration yet correct?\n\nhttps://github.com/openstack/nova/blob/4318bfdd189468cd51e74319cc12366754fa54c7/nova/api/openstack/compute/migrate_server.py#L133","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c5ee880a996208682fe0838f7f9a2438c7d52c3b","unresolved":false,"context_lines":[{"line_number":3293,"context_line":"                # numbered request group that is always fulfilled by one"},{"line_number":3294,"context_line":"                # resource provider. So we only pass that single RP UUID here."},{"line_number":3295,"context_line":"                binding_profile[constants.ALLOCATION] \u003d \\"},{"line_number":3296,"context_line":"                    provider_mappings[p[\u0027id\u0027]][0]"},{"line_number":3297,"context_line":"                updates[constants.BINDING_PROFILE] \u003d binding_profile"},{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"            port_updates.append((p[\u0027id\u0027], updates))"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_872564c1","line":3296,"range":{"start_line":3296,"start_character":20,"end_line":3296,"end_character":37},"in_reply_to":"7faddb67_025e5012","updated":"2019-09-04 09:44:38.000000000","message":"Live migration is rejected from the API.","commit_id":"656ddb7d4393c468e63a7929c8c0155fd2be2248"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9592b861b09e64b67d16bf4a1bb1f619a173dbef","unresolved":false,"context_lines":[{"line_number":3288,"context_line":""},{"line_number":3289,"context_line":"            if p.get(\u0027resource_request\u0027):"},{"line_number":3290,"context_line":"                if not provider_mappings:"},{"line_number":3291,"context_line":"                    # NOTE(gibi): This should not happen as the API level"},{"line_number":3292,"context_line":"                    # minimum compute service version check ensures that the"},{"line_number":3293,"context_line":"                    # compute services already send the RequestSpec during"},{"line_number":3294,"context_line":"                    # the move operations between the source and the"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_f13956a2","line":3291,"updated":"2019-09-05 14:06:37.000000000","message":"note to self, this is:\n\nhttps://review.opendev.org/#/c/680394/ - min check for dest in conductor\n\nhttps://review.opendev.org/#/c/680395/ - min check for source compute for cold migrate\n\nhttps://review.opendev.org/#/c/680396/ - min check for source compute for resize","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9592b861b09e64b67d16bf4a1bb1f619a173dbef","unresolved":false,"context_lines":[{"line_number":3296,"context_line":"                    # mapping based on that."},{"line_number":3297,"context_line":"                    raise exception.PortUpdateFailed("},{"line_number":3298,"context_line":"                        port_id\u003dp[\u0027id\u0027],"},{"line_number":3299,"context_line":"                        reason\u003d_(\"Provider mappings wasn\u0027t provided for the \""},{"line_number":3300,"context_line":"                                 \"port with resource request\"))"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"                # NOTE(gibi): In the resource provider mapping there can be"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_314b6e28","line":3299,"range":{"start_line":3299,"start_character":52,"end_line":3299,"end_character":58},"updated":"2019-09-05 14:06:37.000000000","message":"avoid contractions in user-facing error messages/docs","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"171a90a477c1ee796e1c169aa918afe8cd07e426","unresolved":false,"context_lines":[{"line_number":3296,"context_line":"                    # mapping based on that."},{"line_number":3297,"context_line":"                    raise exception.PortUpdateFailed("},{"line_number":3298,"context_line":"                        port_id\u003dp[\u0027id\u0027],"},{"line_number":3299,"context_line":"                        reason\u003d_(\"Provider mappings wasn\u0027t provided for the \""},{"line_number":3300,"context_line":"                                 \"port with resource request\"))"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"                # NOTE(gibi): In the resource provider mapping there can be"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_41693f23","line":3299,"range":{"start_line":3299,"start_character":52,"end_line":3299,"end_character":58},"in_reply_to":"7faddb67_314b6e28","updated":"2019-09-07 15:55:11.000000000","message":"Done","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9592b861b09e64b67d16bf4a1bb1f619a173dbef","unresolved":false,"context_lines":[{"line_number":3296,"context_line":"                    # mapping based on that."},{"line_number":3297,"context_line":"                    raise exception.PortUpdateFailed("},{"line_number":3298,"context_line":"                        port_id\u003dp[\u0027id\u0027],"},{"line_number":3299,"context_line":"                        reason\u003d_(\"Provider mappings wasn\u0027t provided for the \""},{"line_number":3300,"context_line":"                                 \"port with resource request\"))"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"                # NOTE(gibi): In the resource provider mapping there can be"},{"line_number":3303,"context_line":"                # more than one RP fulfilling a request group. But resource"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_91cca234","line":3300,"range":{"start_line":3299,"start_character":59,"end_line":3300,"end_character":61},"updated":"2019-09-05 14:06:37.000000000","message":"This message could use some work. If an operator sees this in the logs triaging a failed cold migration or resize, are they going to know what it means? Probably not. Maybe we should say something like \"Provider mappings are not available to the compute service but are required for ports with a resource request. If compute RPC API versions are pinned for a rolling upgrade, you will need to retry this operation once the RPC version is unpinned and the nova-compute services are all upgraded.\"","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"64734dc9016ccc5a532a3eb442d1679439c1efd2","unresolved":false,"context_lines":[{"line_number":3296,"context_line":"                    # mapping based on that."},{"line_number":3297,"context_line":"                    raise exception.PortUpdateFailed("},{"line_number":3298,"context_line":"                        port_id\u003dp[\u0027id\u0027],"},{"line_number":3299,"context_line":"                        reason\u003d_(\"Provider mappings wasn\u0027t provided for the \""},{"line_number":3300,"context_line":"                                 \"port with resource request\"))"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"                # NOTE(gibi): In the resource provider mapping there can be"},{"line_number":3303,"context_line":"                # more than one RP fulfilling a request group. But resource"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_f17cd321","line":3300,"range":{"start_line":3299,"start_character":59,"end_line":3300,"end_character":61},"in_reply_to":"5faad753_0e706a72","updated":"2019-09-06 08:46:45.000000000","message":"This is a last resort failure. Both the source and the destination service version is checked in the changes top of this. This handles the case when both the source and the destination computes are new (service version \u003e\u003d39) BUT there is a upgrade level pin in the configuration that causes that an older RPC version (\u003c5.2) is used and therefore the RequestSpec does not reach the finish_resize on the dest node.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"171a90a477c1ee796e1c169aa918afe8cd07e426","unresolved":false,"context_lines":[{"line_number":3296,"context_line":"                    # mapping based on that."},{"line_number":3297,"context_line":"                    raise exception.PortUpdateFailed("},{"line_number":3298,"context_line":"                        port_id\u003dp[\u0027id\u0027],"},{"line_number":3299,"context_line":"                        reason\u003d_(\"Provider mappings wasn\u0027t provided for the \""},{"line_number":3300,"context_line":"                                 \"port with resource request\"))"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"                # NOTE(gibi): In the resource provider mapping there can be"},{"line_number":3303,"context_line":"                # more than one RP fulfilling a request group. But resource"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_216c4335","line":3300,"range":{"start_line":3299,"start_character":59,"end_line":3300,"end_character":61},"in_reply_to":"5faad753_582ce446","updated":"2019-09-07 15:55:11.000000000","message":"Done in a follow up.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6a1b5d8054717b82da9dd96397369817d5e2ab95","unresolved":false,"context_lines":[{"line_number":3296,"context_line":"                    # mapping based on that."},{"line_number":3297,"context_line":"                    raise exception.PortUpdateFailed("},{"line_number":3298,"context_line":"                        port_id\u003dp[\u0027id\u0027],"},{"line_number":3299,"context_line":"                        reason\u003d_(\"Provider mappings wasn\u0027t provided for the \""},{"line_number":3300,"context_line":"                                 \"port with resource request\"))"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"                # NOTE(gibi): In the resource provider mapping there can be"},{"line_number":3303,"context_line":"                # more than one RP fulfilling a request group. But resource"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_582ce446","line":3300,"range":{"start_line":3299,"start_character":59,"end_line":3300,"end_character":61},"in_reply_to":"5faad753_f17cd321","updated":"2019-09-06 12:57:51.000000000","message":"Yeah I realize this is last resort, but the error message won\u0027t mean anything to an admin or support person reading this which is why I suggested some alternate wording.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d134dae16b57096722bdf1095845c5a94395c930","unresolved":false,"context_lines":[{"line_number":3296,"context_line":"                    # mapping based on that."},{"line_number":3297,"context_line":"                    raise exception.PortUpdateFailed("},{"line_number":3298,"context_line":"                        port_id\u003dp[\u0027id\u0027],"},{"line_number":3299,"context_line":"                        reason\u003d_(\"Provider mappings wasn\u0027t provided for the \""},{"line_number":3300,"context_line":"                                 \"port with resource request\"))"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"                # NOTE(gibi): In the resource provider mapping there can be"},{"line_number":3303,"context_line":"                # more than one RP fulfilling a request group. But resource"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_0e706a72","line":3300,"range":{"start_line":3299,"start_character":59,"end_line":3300,"end_character":61},"in_reply_to":"7faddb67_91cca234","updated":"2019-09-06 07:41:50.000000000","message":"Yeah that\u0027s mostly my concern, but I feel we need to address this in the upper changes, since that\u0027s where the impact is done.\nTBC, as a user, I could be afraid to not be able to resize a server without exactly knowing why.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"}],"nova/tests/unit/network/test_neutronv2.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9592b861b09e64b67d16bf4a1bb1f619a173dbef","unresolved":false,"context_lines":[{"line_number":4543,"context_line":"             constants.BINDING_PROFILE:"},{"line_number":4544,"context_line":"                 {\u0027allocation\u0027: uuids.source_compute_rp},"},{"line_number":4545,"context_line":"             \u0027resource_request\u0027: mock.sentinel.resource_request}]}"},{"line_number":4546,"context_line":"        migration \u003d {\u0027status\u0027: \u0027confirmed\u0027,"},{"line_number":4547,"context_line":"                     \u0027migration_type\u0027: \"migration\"}"},{"line_number":4548,"context_line":"        list_ports_mock \u003d mock.Mock(return_value\u003dfake_ports)"},{"line_number":4549,"context_line":"        get_client_mock.return_value.list_ports \u003d list_ports_mock"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_d1ef7a84","line":4546,"range":{"start_line":4546,"start_character":20,"end_line":4546,"end_character":21},"updated":"2019-09-05 14:06:37.000000000","message":"nit: would be better to use a Migration object here if we ever want to remove the dict compat mixin on the Migration object - using dicts in tests where it\u0027s an object in code makes that harder.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"171a90a477c1ee796e1c169aa918afe8cd07e426","unresolved":false,"context_lines":[{"line_number":4543,"context_line":"             constants.BINDING_PROFILE:"},{"line_number":4544,"context_line":"                 {\u0027allocation\u0027: uuids.source_compute_rp},"},{"line_number":4545,"context_line":"             \u0027resource_request\u0027: mock.sentinel.resource_request}]}"},{"line_number":4546,"context_line":"        migration \u003d {\u0027status\u0027: \u0027confirmed\u0027,"},{"line_number":4547,"context_line":"                     \u0027migration_type\u0027: \"migration\"}"},{"line_number":4548,"context_line":"        list_ports_mock \u003d mock.Mock(return_value\u003dfake_ports)"},{"line_number":4549,"context_line":"        get_client_mock.return_value.list_ports \u003d list_ports_mock"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_c1cbef1b","line":4546,"range":{"start_line":4546,"start_character":20,"end_line":4546,"end_character":21},"in_reply_to":"7faddb67_d1ef7a84","updated":"2019-09-07 15:55:11.000000000","message":"Good point. It was copy-past from above. Done in a follow up.","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9592b861b09e64b67d16bf4a1bb1f619a173dbef","unresolved":false,"context_lines":[{"line_number":4569,"context_line":"             constants.BINDING_PROFILE:"},{"line_number":4570,"context_line":"                 {\u0027allocation\u0027: uuids.source_compute_rp},"},{"line_number":4571,"context_line":"             \u0027resource_request\u0027: mock.sentinel.resource_request}]}"},{"line_number":4572,"context_line":"        migration \u003d {\u0027status\u0027: \u0027confirmed\u0027,"},{"line_number":4573,"context_line":"                     \u0027migration_type\u0027: \"migration\"}"},{"line_number":4574,"context_line":"        list_ports_mock \u003d mock.Mock(return_value\u003dfake_ports)"},{"line_number":4575,"context_line":"        get_client_mock.return_value.list_ports \u003d list_ports_mock"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_b1e8be7a","line":4572,"range":{"start_line":4572,"start_character":20,"end_line":4572,"end_character":21},"updated":"2019-09-05 14:06:37.000000000","message":"same","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"171a90a477c1ee796e1c169aa918afe8cd07e426","unresolved":false,"context_lines":[{"line_number":4569,"context_line":"             constants.BINDING_PROFILE:"},{"line_number":4570,"context_line":"                 {\u0027allocation\u0027: uuids.source_compute_rp},"},{"line_number":4571,"context_line":"             \u0027resource_request\u0027: mock.sentinel.resource_request}]}"},{"line_number":4572,"context_line":"        migration \u003d {\u0027status\u0027: \u0027confirmed\u0027,"},{"line_number":4573,"context_line":"                     \u0027migration_type\u0027: \"migration\"}"},{"line_number":4574,"context_line":"        list_ports_mock \u003d mock.Mock(return_value\u003dfake_ports)"},{"line_number":4575,"context_line":"        get_client_mock.return_value.list_ports \u003d list_ports_mock"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_61d0fbca","line":4572,"range":{"start_line":4572,"start_character":20,"end_line":4572,"end_character":21},"in_reply_to":"7faddb67_b1e8be7a","updated":"2019-09-07 15:55:11.000000000","message":"Done","commit_id":"a2984b647a4ed9b593df0cd5ac5077e2c86e1c85"}]}
