)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3bbaef290844e880dbe593d8da60f93bc0f74a8d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     root \u003cshrike_@mail.ru\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-07-18 05:00:38 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fixes broken shared live migration of a vm with a vif aka Bug #1888395"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"target side calls get_dest_vif member during initialization"},{"line_number":10,"context_line":"stage of migration on a VIFMigrateData instance prepared locally."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9f560f44_9c911c4a","line":7,"range":{"start_line":7,"start_character":58,"end_line":7,"end_character":70},"updated":"2020-08-17 18:06:43.000000000","message":"This belongs in a Closes-Bug: #XX header down by Change-Id","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9a6ed40297b61c156a10cd2b5060d6d92e943bfe","unresolved":false,"context_lines":[{"line_number":11,"context_line":"there is nobody to set the vif_type attribute value to that"},{"line_number":12,"context_line":"instance earlier thus the migration fails with an exception at the"},{"line_number":13,"context_line":"target."},{"line_number":14,"context_line":"fortunatelly, the value is available in the source_vif object which"},{"line_number":15,"context_line":"is set definitely because of the test inside the get_dest_vif function."},{"line_number":16,"context_line":"result value of the function is a deep copy of the source_vif object"},{"line_number":17,"context_line":"then several attributes are replaced with the values from the"},{"line_number":18,"context_line":"VIFMigrateData instance."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9f560f44_f74e6e36","line":15,"range":{"start_line":14,"start_character":0,"end_line":15,"end_character":71},"updated":"2020-08-18 01:53:54.000000000","message":"I need to review this in the morining but you cannot assume the viftyp of the souce and destination host will be the same\n\nits perfectly valid for ots os valid for it tp change.\n\nthe vif type is derived form the neutron port binding specifcifcally the ahoritive soruce for the dest vif type is the neutron port binding reponce from when we create the destiantion port binging before we activate it.","commit_id":"3f5a9d0d2869470317720b84b152749bc6615541"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9a6ed40297b61c156a10cd2b5060d6d92e943bfe","unresolved":false,"context_lines":[{"line_number":16,"context_line":"result value of the function is a deep copy of the source_vif object"},{"line_number":17,"context_line":"then several attributes are replaced with the values from the"},{"line_number":18,"context_line":"VIFMigrateData instance."},{"line_number":19,"context_line":"let\u0027s skip accesses to unset VIFMigrateData instance attributes"},{"line_number":20,"context_line":"and rest with the values from the source_vif."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ia00277ac8a68a635db85f9e0ce2c6d8df396e0d8"},{"line_number":23,"context_line":"Closes-Bug: #1888395"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9f560f44_9759f2ff","line":20,"range":{"start_line":19,"start_character":0,"end_line":20,"end_character":45},"updated":"2020-08-18 01:53:54.000000000","message":"this is not correct. \n\nthis describes the workflow we shoudl be taking\nhttps://specs.openstack.org/openstack/nova-specs/specs/rocky/implemented/neutron-new-port-binding-api.html","commit_id":"3f5a9d0d2869470317720b84b152749bc6615541"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"37eb0ffa5a80e4d756870c440d41ee257596d1ab","unresolved":false,"context_lines":[{"line_number":20,"context_line":"and rest with the values from the source_vif."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ia00277ac8a68a635db85f9e0ce2c6d8df396e0d8"},{"line_number":23,"context_line":"Closes-Bug: #1888395"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9f560f44_b7e076fa","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":20},"updated":"2020-08-18 02:00:26.000000000","message":"by the way this says the migration worked in queens but not in train but in rocky we completely change how live migration works.\n\nin queues we only had one port binding in rocky+ we have 2.\nin queens if the port binding changed we would fail silently or in some cases not either because the xml was not correct or the tools required were not on the host.\n\ne.g. linux bridge to ovs would fail silently with the wrong xml ovs to linx bridge would fail because ovs was nto on the host when libvirt tries to add the port to the ovs bridge.\n\nfrom rocky on we create the port binding before we migrate and generate the xml acordingly. that allows the network backend( vif_type) to change at least in principal there are some bug that make it not work in some cases but by design it should allow you to change backedn with is important for upgrades.\n\nwe cant just use the vif_type form the souce or it will break that usecase.\nthat was usecase 3 \nhttps://specs.openstack.org/openstack/nova-specs/specs/rocky/implemented/neutron-new-port-binding-api.html#use-cases","commit_id":"3f5a9d0d2869470317720b84b152749bc6615541"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":20,"context_line":"broke the semantics of the migrate_data object by"},{"line_number":21,"context_line":"unconditionally populating the vifs field"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This change restores the rocky semantics, which are depended"},{"line_number":24,"context_line":"on in several parts of the code base, by only condtionally"},{"line_number":25,"context_line":"populating vifs if neutron support multiple port bindings."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_e2030e0c","line":23,"range":{"start_line":23,"start_character":52,"end_line":23,"end_character":60},"updated":"2020-09-07 16:53:57.000000000","message":"dependent","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b42e97ac97b5f64bccfeeca13e27fae8b9d5acbc","unresolved":false,"context_lines":[{"line_number":20,"context_line":"broke the semantics of the migrate_data object by"},{"line_number":21,"context_line":"unconditionally populating the vifs field"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This change restores the rocky semantics, which are depended"},{"line_number":24,"context_line":"on in several parts of the code base, by only condtionally"},{"line_number":25,"context_line":"populating vifs if neutron support multiple port bindings."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_adef47af","line":23,"range":{"start_line":23,"start_character":52,"end_line":23,"end_character":60},"in_reply_to":"9f560f44_e2030e0c","updated":"2020-09-07 20:22:23.000000000","message":"no this was correct.\n\nthis changes the meaning of the sentence\n\nim not trying to say the rocky semantics depend on several parts of the code base.\n\ni am saying that several parts of the code base expect the rocky semantics.","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":21,"context_line":"unconditionally populating the vifs field"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This change restores the rocky semantics, which are depended"},{"line_number":24,"context_line":"on in several parts of the code base, by only condtionally"},{"line_number":25,"context_line":"populating vifs if neutron support multiple port bindings."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_220a261f","line":24,"range":{"start_line":24,"start_character":46,"end_line":24,"end_character":58},"updated":"2020-09-07 16:53:57.000000000","message":"conditionally","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":21,"context_line":"unconditionally populating the vifs field"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This change restores the rocky semantics, which are depended"},{"line_number":24,"context_line":"on in several parts of the code base, by only condtionally"},{"line_number":25,"context_line":"populating vifs if neutron support multiple port bindings."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_42059a0f","line":24,"range":{"start_line":24,"start_character":3,"end_line":24,"end_character":5},"updated":"2020-09-07 16:53:57.000000000","message":"drop","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b42e97ac97b5f64bccfeeca13e27fae8b9d5acbc","unresolved":false,"context_lines":[{"line_number":21,"context_line":"unconditionally populating the vifs field"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This change restores the rocky semantics, which are depended"},{"line_number":24,"context_line":"on in several parts of the code base, by only condtionally"},{"line_number":25,"context_line":"populating vifs if neutron support multiple port bindings."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_8dec03bc","line":24,"range":{"start_line":24,"start_character":3,"end_line":24,"end_character":5},"in_reply_to":"9f560f44_42059a0f","updated":"2020-09-07 20:22:23.000000000","message":"this should have been \"by\" although \"in\" technically works too.","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This change restores the rocky semantics, which are depended"},{"line_number":24,"context_line":"on in several parts of the code base, by only condtionally"},{"line_number":25,"context_line":"populating vifs if neutron support multiple port bindings."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":28,"context_line":"Change-Id: Ia00277ac8a68a635db85f9e0ce2c6d8df396e0d8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_82121257","line":25,"range":{"start_line":25,"start_character":27,"end_line":25,"end_character":34},"updated":"2020-09-07 16:53:57.000000000","message":"supports","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b42e97ac97b5f64bccfeeca13e27fae8b9d5acbc","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This change restores the rocky semantics, which are depended"},{"line_number":24,"context_line":"on in several parts of the code base, by only condtionally"},{"line_number":25,"context_line":"populating vifs if neutron support multiple port bindings."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":28,"context_line":"Change-Id: Ia00277ac8a68a635db85f9e0ce2c6d8df396e0d8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_2d31775a","line":25,"range":{"start_line":25,"start_character":27,"end_line":25,"end_character":34},"in_reply_to":"9f560f44_82121257","updated":"2020-09-07 20:22:23.000000000","message":"Done","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"}],"nova/compute/manager.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"513bb21c951384e6b9a35730a5c92ab302b078e3","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"                                            instance,"},{"line_number":1285,"context_line":"                                            vm_power_state)"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"        # The following checks are for live migration. We want to activate"},{"line_number":1288,"context_line":"        # the port binding for the destination host before the live migration"},{"line_number":1289,"context_line":"        # is resumed on the destination host in order to reduce network"},{"line_number":1290,"context_line":"        # downtime. Otherwise the ports are bound to the destination host"},{"line_number":1291,"context_line":"        # in post_live_migration_at_destination."},{"line_number":1292,"context_line":"        # TODO(danms): Explore options for using a different live migration"},{"line_number":1293,"context_line":"        # specific callback for this instead of piggy-backing on the"},{"line_number":1294,"context_line":"        # handle_lifecycle_event callback."},{"line_number":1295,"context_line":"        if (instance.task_state \u003d\u003d task_states.MIGRATING and"},{"line_number":1296,"context_line":"                event_transition in migrate_finish_statuses):"},{"line_number":1297,"context_line":"            status \u003d migrate_finish_statuses[event_transition]"},{"line_number":1298,"context_line":"            try:"},{"line_number":1299,"context_line":"                migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1300,"context_line":"                            context, instance.uuid, status)"},{"line_number":1301,"context_line":"                LOG.debug(\u0027Binding ports to destination host: %s\u0027,"},{"line_number":1302,"context_line":"                          migration.dest_compute, instance\u003dinstance)"},{"line_number":1303,"context_line":"                # For neutron, migrate_instance_start will activate the"},{"line_number":1304,"context_line":"                # destination host port bindings, if there are any created by"},{"line_number":1305,"context_line":"                # conductor before live migration started."},{"line_number":1306,"context_line":"                self.network_api.migrate_instance_start("},{"line_number":1307,"context_line":"                    context, instance, migration)"},{"line_number":1308,"context_line":"            except exception.MigrationNotFoundByStatus:"},{"line_number":1309,"context_line":"                LOG.warning(\"Unable to find migration record with status \""},{"line_number":1310,"context_line":"                            \"\u0027%s\u0027 for instance. Port binding will happen in \""},{"line_number":1311,"context_line":"                            \"post live migration.\", status, instance\u003dinstance)"},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"    def handle_events(self, event):"},{"line_number":1314,"context_line":"        if isinstance(event, virtevent.LifecycleEvent):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_699a3562","line":1311,"range":{"start_line":1287,"start_character":3,"end_line":1311,"end_character":78},"updated":"2020-08-21 21:32:45.000000000","message":"in the multiple port binding flow we activate teh port binding here. the network-vif-plugged event is sent when a binding is active on the host and the backend on that host has finished plugging the vif.","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"728e2e05d8e008998d1df6b7d7a411a60b12ba3c","unresolved":false,"context_lines":[{"line_number":7647,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":7648,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":7649,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":7650,"context_line":"            if self.network_api.supports_port_binding_extension(ctxt):"},{"line_number":7651,"context_line":"                # Create migrate_data vifs"},{"line_number":7652,"context_line":"                migrate_data.vifs \u003d \\"},{"line_number":7653,"context_line":"                    migrate_data_obj.\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_3cf08bfd","line":7650,"range":{"start_line":7650,"start_character":11,"end_line":7650,"end_character":70},"updated":"2020-08-21 00:34:46.000000000","message":"i\u0027m not currently mocking this in the unit tests so the unit test that execute this code path will fail. on a real deployment this should work however.\n\ni also need to add unit tests to assert the correct behaviour with regards to populating or not populating vifs based on if this returns true or false.\n\nill do that after i create the repoducer functional test as i wanted to push this so you can test it if you have time and see if it fixes your issue.","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"13845d389f1a31b293c9b0214feae83742e43ba6","unresolved":false,"context_lines":[{"line_number":7647,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":7648,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":7649,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":7650,"context_line":"            if self.network_api.supports_port_binding_extension(ctxt):"},{"line_number":7651,"context_line":"                # Create migrate_data vifs"},{"line_number":7652,"context_line":"                migrate_data.vifs \u003d \\"},{"line_number":7653,"context_line":"                    migrate_data_obj.\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_46f00068","line":7650,"range":{"start_line":7650,"start_character":11,"end_line":7650,"end_character":70},"in_reply_to":"9f560f44_3cf08bfd","updated":"2020-08-21 20:17:45.000000000","message":"this seems working. still there is a neutron event issue, i.e. live migration doesn\u0027t emit one and the source fails because of timeout waiting for the event. the emission needs to be similar to what create does.","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"513bb21c951384e6b9a35730a5c92ab302b078e3","unresolved":false,"context_lines":[{"line_number":7647,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":7648,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":7649,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":7650,"context_line":"            if self.network_api.supports_port_binding_extension(ctxt):"},{"line_number":7651,"context_line":"                # Create migrate_data vifs"},{"line_number":7652,"context_line":"                migrate_data.vifs \u003d \\"},{"line_number":7653,"context_line":"                    migrate_data_obj.\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_a97a8d20","line":7650,"range":{"start_line":7650,"start_character":11,"end_line":7650,"end_character":70},"in_reply_to":"9f560f44_46f00068","updated":"2020-08-21 21:32:45.000000000","message":"your refering to the network-vif-plugged event when sent when the neutron backend finishes wiring up the ports on the physical host.\n\nin the multiple port biding flow i belive we start waiting for those event on the souce node but in the singel port binding workflow we should only wait for thoes even on the destination in post live migrate.\n\n\nat least i think that was how this used to work so likel i also have to make the waiting for the event  conditional.","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2e3f79d8966f052929173427df8c5f6265dbca86","unresolved":false,"context_lines":[{"line_number":7647,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":7648,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":7649,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":7650,"context_line":"            if self.network_api.supports_port_binding_extension(ctxt):"},{"line_number":7651,"context_line":"                # Create migrate_data vifs"},{"line_number":7652,"context_line":"                migrate_data.vifs \u003d \\"},{"line_number":7653,"context_line":"                    migrate_data_obj.\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_2ac3f958","line":7650,"range":{"start_line":7650,"start_character":11,"end_line":7650,"end_character":70},"in_reply_to":"9f560f44_6fc18354","updated":"2020-08-24 12:29:34.000000000","message":"ok if changing the config option fixes this for you ill just make that option only apply to multiple port bindigns.\n\ni don think it makes sense in this case anyway since we dont expect to get the event untill we update the port later.","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"7a7f49bbb6f4f220c2940466a305f5c86ebfc0f7","unresolved":false,"context_lines":[{"line_number":7647,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":7648,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":7649,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":7650,"context_line":"            if self.network_api.supports_port_binding_extension(ctxt):"},{"line_number":7651,"context_line":"                # Create migrate_data vifs"},{"line_number":7652,"context_line":"                migrate_data.vifs \u003d \\"},{"line_number":7653,"context_line":"                    migrate_data_obj.\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_6fc18354","line":7650,"range":{"start_line":7650,"start_character":11,"end_line":7650,"end_character":70},"in_reply_to":"9f560f44_a97a8d20","updated":"2020-08-24 11:28:14.000000000","message":"\u003e your refering to the network-vif-plugged event when sent when the\n \u003e neutron backend finishes wiring up the ports on the physical host.\n \u003e \n \u003e in the multiple port biding flow i belive we start waiting for\n \u003e those event on the souce node but in the singel port binding\n \u003e workflow we should only wait for thoes even on the destination in\n \u003e post live migrate.\n \u003e \n \u003e \n \u003e at least i think that was how this used to work so likel i also\n \u003e have to make the waiting for the event  conditional.\n\nright, this is how we workaround the problem","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"513bb21c951384e6b9a35730a5c92ab302b078e3","unresolved":false,"context_lines":[{"line_number":7820,"context_line":"                                           disk,"},{"line_number":7821,"context_line":"                                           migrate_data)"},{"line_number":7822,"context_line":"            LOG.debug(\u0027driver pre_live_migration data is %s\u0027, migrate_data)"},{"line_number":7823,"context_line":"            # driver.pre_live_migration is what plugs vifs on the destination"},{"line_number":7824,"context_line":"            # host so now we can set the wait_for_vif_plugged flag in the"},{"line_number":7825,"context_line":"            # migrate_data object which the source compute will use to"},{"line_number":7826,"context_line":"            # determine if it should wait for a \u0027network-vif-plugged\u0027 event"},{"line_number":7827,"context_line":"            # from neutron before starting the actual guest transfer in the"},{"line_number":7828,"context_line":"            # hypervisor"},{"line_number":7829,"context_line":"            migrate_data.wait_for_vif_plugged \u003d ("},{"line_number":7830,"context_line":"                CONF.compute.live_migration_wait_for_vif_plug)"},{"line_number":7831,"context_line":""},{"line_number":7832,"context_line":"            # NOTE(tr3buchet): setup networks on destination host"},{"line_number":7833,"context_line":"            self.network_api.setup_networks_on_host(context, instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_e94125a8","line":7830,"range":{"start_line":7823,"start_character":12,"end_line":7830,"end_character":62},"updated":"2020-08-21 21:32:45.000000000","message":"this is where we decied if we should wait on on the source host or not.\n\nthis is reading the value form the  config so you could try setting it to False\ne.g.\n[compute]\nlive_migration_wait_for_vif_plug\u003dfalse\n\nhowever this should proably be False if we are not using\nmultiple port bindings.\n\nso this should be something like this\n\nusing_multiple_port_bindings \u003d \u0027vifs\u0027 in migrate_data and migrate_data.vifs\nmigrate_data.wait_for_vif_plugged \u003d (CONF.compute.live_migration_wait_for_vif_plug and using_multiple_port_bindings )","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"513bb21c951384e6b9a35730a5c92ab302b078e3","unresolved":false,"context_lines":[{"line_number":7969,"context_line":"            # to wait for before calling pre_live_migration. Then if the"},{"line_number":7970,"context_line":"            # dest host reports back that we shouldn\u0027t wait, we can break"},{"line_number":7971,"context_line":"            # out of the context manager using _BreakWaitForInstanceEvent."},{"line_number":7972,"context_line":"            with self.virtapi.wait_for_instance_event("},{"line_number":7973,"context_line":"                    instance, events, deadline\u003ddeadline,"},{"line_number":7974,"context_line":"                    error_callback\u003derror_cb):"},{"line_number":7975,"context_line":"                with timeutils.StopWatch() as timer:"},{"line_number":7976,"context_line":"                    # TODO(mriedem): The \"block_migration\" parameter passed"},{"line_number":7977,"context_line":"                    # here is not actually used in pre_live_migration but it"},{"line_number":7978,"context_line":"                    # is not optional in the RPC interface either."},{"line_number":7979,"context_line":"                    migrate_data \u003d self.compute_rpcapi.pre_live_migration("},{"line_number":7980,"context_line":"                        context, instance,"},{"line_number":7981,"context_line":"                        block_migration, disk, dest, migrate_data)"},{"line_number":7982,"context_line":"                LOG.info(\u0027Took %0.2f seconds for pre_live_migration on \u0027"},{"line_number":7983,"context_line":"                         \u0027destination host %s.\u0027,"},{"line_number":7984,"context_line":"                         timer.elapsed(), dest, instance\u003dinstance)"},{"line_number":7985,"context_line":"                wait_for_vif_plugged \u003d ("},{"line_number":7986,"context_line":"                    \u0027wait_for_vif_plugged\u0027 in migrate_data and"},{"line_number":7987,"context_line":"                    migrate_data.wait_for_vif_plugged)"},{"line_number":7988,"context_line":"                if events and not wait_for_vif_plugged:"},{"line_number":7989,"context_line":"                    raise _BreakWaitForInstanceEvent"},{"line_number":7990,"context_line":"        except _BreakWaitForInstanceEvent:"},{"line_number":7991,"context_line":"            if events:"},{"line_number":7992,"context_line":"                LOG.debug(\u0027Not waiting for events after pre_live_migration: \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_69b355ea","line":7989,"range":{"start_line":7972,"start_character":10,"end_line":7989,"end_character":52},"updated":"2020-08-21 21:32:45.000000000","message":"im assuming this is what is failng.\n\n@sergey can you provide some logs messages for us to review for the network event that you mentions\n\nis this where its failing?","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"34baddd7b8bf1501af875f7b64cb28498519e326","unresolved":false,"context_lines":[{"line_number":7969,"context_line":"            # to wait for before calling pre_live_migration. Then if the"},{"line_number":7970,"context_line":"            # dest host reports back that we shouldn\u0027t wait, we can break"},{"line_number":7971,"context_line":"            # out of the context manager using _BreakWaitForInstanceEvent."},{"line_number":7972,"context_line":"            with self.virtapi.wait_for_instance_event("},{"line_number":7973,"context_line":"                    instance, events, deadline\u003ddeadline,"},{"line_number":7974,"context_line":"                    error_callback\u003derror_cb):"},{"line_number":7975,"context_line":"                with timeutils.StopWatch() as timer:"},{"line_number":7976,"context_line":"                    # TODO(mriedem): The \"block_migration\" parameter passed"},{"line_number":7977,"context_line":"                    # here is not actually used in pre_live_migration but it"},{"line_number":7978,"context_line":"                    # is not optional in the RPC interface either."},{"line_number":7979,"context_line":"                    migrate_data \u003d self.compute_rpcapi.pre_live_migration("},{"line_number":7980,"context_line":"                        context, instance,"},{"line_number":7981,"context_line":"                        block_migration, disk, dest, migrate_data)"},{"line_number":7982,"context_line":"                LOG.info(\u0027Took %0.2f seconds for pre_live_migration on \u0027"},{"line_number":7983,"context_line":"                         \u0027destination host %s.\u0027,"},{"line_number":7984,"context_line":"                         timer.elapsed(), dest, instance\u003dinstance)"},{"line_number":7985,"context_line":"                wait_for_vif_plugged \u003d ("},{"line_number":7986,"context_line":"                    \u0027wait_for_vif_plugged\u0027 in migrate_data and"},{"line_number":7987,"context_line":"                    migrate_data.wait_for_vif_plugged)"},{"line_number":7988,"context_line":"                if events and not wait_for_vif_plugged:"},{"line_number":7989,"context_line":"                    raise _BreakWaitForInstanceEvent"},{"line_number":7990,"context_line":"        except _BreakWaitForInstanceEvent:"},{"line_number":7991,"context_line":"            if events:"},{"line_number":7992,"context_line":"                LOG.debug(\u0027Not waiting for events after pre_live_migration: \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_64d99881","line":7989,"range":{"start_line":7972,"start_character":10,"end_line":7989,"end_character":52},"in_reply_to":"9f560f44_69b355ea","updated":"2020-08-25 09:16:11.000000000","message":"\u003e im assuming this is what is failng.\n \u003e \n \u003e @sergey can you provide some logs messages for us to review for the\n \u003e network event that you mentions\n \u003e \n \u003e is this where its failing?\n\nok. i\u0027ll deploy a test stand and post these messages","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb671cd03434bc5bd7fb784aecea596b5f2e318e","unresolved":false,"context_lines":[{"line_number":7829,"context_line":"            # determine if it should wait for a \u0027network-vif-plugged\u0027 event"},{"line_number":7830,"context_line":"            # from neutron before starting the actual guest transfer in the"},{"line_number":7831,"context_line":"            # hypervisor"},{"line_number":7832,"context_line":"            using_multiple_port_bindings \u003d ("},{"line_number":7833,"context_line":"                \u0027vifs\u0027 in migrate_data and migrate_data.vifs)"},{"line_number":7834,"context_line":"            migrate_data.wait_for_vif_plugged \u003d ("},{"line_number":7835,"context_line":"                CONF.compute.live_migration_wait_for_vif_plug and"},{"line_number":7836,"context_line":"                using_multiple_port_bindings"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_e255c91f","line":7833,"range":{"start_line":7832,"start_character":0,"end_line":7833,"end_character":61},"updated":"2020-09-08 07:48:41.000000000","message":"nit: Seeing as you have to use brackets anyway, maybe just fold this in? Checking if a field is set before checking it\u0027s value is a fairly common pattern with o.vos","commit_id":"b8f3be6b3c5af91d215b4a0cecb9be098e8d8799"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3f3407f85874f4246ce60d9054bd8b603726f33d","unresolved":false,"context_lines":[{"line_number":7829,"context_line":"            # determine if it should wait for a \u0027network-vif-plugged\u0027 event"},{"line_number":7830,"context_line":"            # from neutron before starting the actual guest transfer in the"},{"line_number":7831,"context_line":"            # hypervisor"},{"line_number":7832,"context_line":"            using_multiple_port_bindings \u003d ("},{"line_number":7833,"context_line":"                \u0027vifs\u0027 in migrate_data and migrate_data.vifs)"},{"line_number":7834,"context_line":"            migrate_data.wait_for_vif_plugged \u003d ("},{"line_number":7835,"context_line":"                CONF.compute.live_migration_wait_for_vif_plug and"},{"line_number":7836,"context_line":"                using_multiple_port_bindings"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_9b555453","line":7833,"range":{"start_line":7832,"start_character":0,"end_line":7833,"end_character":61},"in_reply_to":"9f560f44_e255c91f","updated":"2020-09-08 10:33:02.000000000","message":"i have a follow up patch that makes this a property of the migrate_data object","commit_id":"b8f3be6b3c5af91d215b4a0cecb9be098e8d8799"}],"nova/objects/migrate_data.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3bbaef290844e880dbe593d8da60f93bc0f74a8d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_fc83f802","line":97,"updated":"2020-08-17 18:06:43.000000000","message":"This is almost definitely the wrong thing to do. Making the object just option-out all of these things when asked for the dest vif is likely papering over some other compatibility problem.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d7119fc24590e4752a8a1fd9b1e66519299be9bb","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_e4c98c78","line":97,"in_reply_to":"9f560f44_1e1a0d7c","updated":"2020-08-18 22:01:44.000000000","message":"https://github.com/Juniper/contrail-vrouter\nused to be the neutron itegration for vrouter.\nit has now moved to https://github.com/tungstenfabric/tf-neutron-plugin\n\nlooking at the code base vrouter is integrated though what looks like a custom core plug-in instead of an ml2 driver.\n\nml2 does not appear in the code base \nhttps://github.com/tungstenfabric/tf-neutron-plugin/search?q\u003dml2\u0026unscoped_q\u003dml2\n\nthat means that the core plugin needs to implement\nhttps://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/portbindings_extended.py\nexplictly.\n\n\nthe other way to integrate vrouter with openstack is to use\nhttps://opendev.org/x/networking-opencontrail/src/branch/master\n\nnetworking-opencontrail does not implement multiple port bindings as far as i can tell\ni dont see an implmentation of binding_activate or binding_deactivate\n\nhttps://opendev.org/openstack/neutron/src/branch/master/neutron/plugins/ml2/rpc.py#L481-L490\n\nthe opencontrail ml2 driver\nhttps://opendev.org/x/networking-opencontrail/src/branch/master/networking_opencontrail/ml2/mech_driver.py#L35\n\ndoes not implement the supported_extensions method\nso it will report it support all extentions since that is the default implemnation it inherits\n\nhttps://github.com/openstack/neutron-lib/blob/96e1d028b84419d187f085b587e672447df00ae3/neutron_lib/plugins/ml2/api.py#L458-L471\n\nso again my guess is that if you are using networking-opencontrail neutron is still reporting binding-extended.\n\nin which case the responce form neutron may be invlaid resulting in the object not being populated.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"39a7ececad45dd8abfeb63218784c9568d2d3fd1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_4f7dda1a","line":97,"in_reply_to":"9f560f44_4764a8e5","updated":"2020-08-20 01:02:07.000000000","message":"that is proably a question better answer by neutorn folks but all the in tree ml2 driver and the ml2 top level plugin support it.\n\nhttps://review.opendev.org/#/c/414251/74 added the dbtabels and most of the implementation. the rest of the series updates the in tree driver to support it.\nthat is proably the best reference for how to add support for the extension.\n\nif you are using a neutron core plugin the simpelest fix for now on older release is to just make sure that binding-extended is not in the exteion list output.\n\nthe older binding extention should be there which will cause nova to fall back to the workflow where the xml for the vifs is not updated. its not ideal but it will work for now.\n\nonce you add support for the multiple port binding endpoint and support creating an inactive port binding on the dest host and activating it then nova can start regenerating the vif info from the dest port binding info.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5c54e7bfa3e567408cbb4e1d13274c970bc5388b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_ad4f6bbb","line":97,"in_reply_to":"9f560f44_4d64cfe5","updated":"2020-08-19 14:41:32.000000000","message":"ya so supported_extensions was apparently just added 23 days ago. neutorn has ment to be filtering support for this extention since it was added in rocky.\n\napparnetly that was not done and it was and is critical to how nova uses it that it is only reported if all ml2 drivers support it.\n\nall the intree drivers support it so all or upstream testing only test with ml2 drivers that support this extension since rocky.\n\nunfortunetly it looks like we are going to have to workaround this in nova or try and find something that is backportable.\n\nto fix this on master we can used implement \n\nsupported_extensions in \nhttps://opendev.org/x/networking-opencontrail/src/branch/master/networking_opencontrail/ml2/mech_driver.py#L35\n\neffectivly  you just need to remove the exteion form the list\n\ne.g.\n    unsupported_extensions \u003d {\u0027binding-extended\u0027}\n    def supported_extensions(self, extensions):\n      return extensions - unsupported_extensions\n\nfor older releases we need to think about how to fix this.\nideally we would fix it in neutron itself but im not sure if there is a simple way to determine if the backbend support the extension. failing that we can perhas see if we can detect a lack of support form the nova side.\n\nwould you be able to capture the output of the creating of the port bindings\n\nim wondering what neutron is currently retruning.\n\nis it returning a error code that we are discarding or is it retruning success but not populating the fileds\n\nwe shoudl be able to detech either case and raise an excption or signel it in some way so that we can revert to the old workflow and remove the port binidngs excption from cached set we get from neutron.\n\nif you can add logging locally and let use know what neutron is returning we can proceed from there.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"ef0cbd63360a6faad7ecbd1150507e883e56f7c0","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_fb5bcc83","line":97,"in_reply_to":"9f560f44_4f7dda1a","updated":"2020-08-20 08:16:00.000000000","message":"\u003e that is proably a question better answer by neutorn folks but all\n \u003e the in tree ml2 driver and the ml2 top level plugin support it.\n \u003e \n \u003e https://review.opendev.org/#/c/414251/74 added the dbtabels and\n \u003e most of the implementation. the rest of the series updates the in\n \u003e tree driver to support it.\n \u003e that is proably the best reference for how to add support for the\n \u003e extension.\n \u003e \n \u003e if you are using a neutron core plugin the simpelest fix for now on\n \u003e older release is to just make sure that binding-extended is not in\n \u003e the exteion list output.\n \u003e \n \u003e the older binding extention should be there which will cause nova\n \u003e to fall back to the workflow where the xml for the vifs is not\n \u003e updated. its not ideal but it will work for now.\n \u003e \n \u003e once you add support for the multiple port binding endpoint and\n \u003e support creating an inactive port binding on the dest host and\n \u003e activating it then nova can start regenerating the vif info from\n \u003e the dest port binding info.\n\nwe don\u0027t have binding-extended in the extensions list in the plugin. migration doesn\u0027t work in train without the patch from the review. it works in older releases. our goal is to make migration working with minimal effort. adding binding-extended leads to unsatisfied dependencies.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"abd0604d8681fdd3d1e993e6c676595f96397559","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_7a623e18","line":97,"in_reply_to":"9f560f44_57175f46","updated":"2020-08-18 11:50:06.000000000","message":"\u003e \u003e 1. exactly like in this one https://review.opendev.org/#/c/738432/3\n \u003e \n \u003e Not really, that handles one probably legitimately optional field,\n \u003e not all the useful details of the VIF.\n \u003e \n \u003e \u003e 2. the problem vif and the target doesn\u0027t have a chance to obtain\n \u003e \u003e the attributes because of its construction method. the target\n \u003e \u003e builds it locally, doesn\u0027t use any data from the source. see the\n \u003e \u003e related code.\n \u003e \n \u003e Then those values should probably be set to None (and maybe be\n \u003e nullable\u003dTrue as a result).\n \u003e \n\nthey are required at least vif_type\n\n \u003e \u003e 3. u still have compatibility problem in vif related code because\n \u003e \u003e create path does send neutron events but migrate one doesn\u0027t.\n \u003e \n \u003e Not sure what this has to do with anything, but show me in tests!\n\nproject doesn\u0027t have tests probably for the scenario because the feature is broken and nobody cares. the patch main purpose is to resurrect online migration in train.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"c279b6faf9314cbe19eacd9c300622bd786accc7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_de77f539","line":97,"in_reply_to":"9f560f44_5d3934a1","updated":"2020-08-18 18:57:05.000000000","message":"\u003e point 3 is certenly not true, we do care about live migration and\n \u003e refusing to add test does not help.\n \u003e \n \u003e your current proposed approuch is not correct by design this is not\n \u003e condtional because all these field are required.\n \u003e \n \u003e if the vif type is not se or any other value above then it means\n \u003e there is an error earlier that has not been handled.\n \u003e \n \u003e when we construcnt the nova vif object we unconditionally recored\n \u003e the vif type in the object as well as the vnic_type, profile and\n \u003e binding details\n \u003e https://github.com/openstack/nova/blob/87269dcaeed7b0234d137bf61ec327703342c2a9/nova/network/neutron.py#L3068-L3072\n \u003e \n \u003e when we livemigate we take a different path by creating a set of\n \u003e new vif objects containing the source vifs(create_skeleton_migrate_vifs),\n \u003e then create port binindg for the destiation host and update the\n \u003e binding form binding responce\n \u003e \n \u003e https://github.com/openstack/nova/blob/d4c857dfcb1ccfa5410de55671e69c722bbc990e/nova/conductor/tasks/live_migrate.py#L377-L383\n \u003e \n \u003e \n \u003e _update_migrate_vifs_from_bindings\n \u003e \n \u003e just loops over the bining reponce values and updates the vif\n \u003e objects with the reponce vlaues\n \u003e \n \u003e for migrate_vif in migrate_vifs:\n \u003e for attr_name, attr_val in bindings[migrate_vif.port_id].items():\n \u003e setattr(migrate_vif, attr_name, attr_val)\n \u003e \n \u003e so for the attirbute above to be unset it means the neutron binding\n \u003e reponce did not contian the require infomation.\n \u003e \n \u003e that likely means the port biniding failed in some way.\n \u003e \n \u003e does vrouter actully impleiment the multiple port bidnign feature?\n \u003e initally the neutron change wehre ment to be don above the ml2\n \u003e driver layear in the the service plugin but the driver actully need\n \u003e to implement a few functrions.\n \u003e \n \u003e vrouter has its own ml2 plugin/driver espcially wehn used with\n \u003e contrail. i suspect that it either does not support multiple port\n \u003e and neutron is incorrectly still reporting binding-extended\n \u003e extentions or there is a bug in the vrouter nueton plugin.\n\ni\u0027ve checked first the code u pointed but the workflow goes another way which is unrelated to the flavor of the vif: it sets source_vif only. there is nobody to set any \"required\" attribute except for the source_vif in prepare live migration stage. plus, the stage doesn\u0027t emit a neutron event expected by the source.\nbtw, the word \u0027likely\u0027 means u are not sure. the problem is definitely unrelated to the multiple port bindings feature.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a26ef3ee6ad2f7555d36b26356e0f47fe6aea0cc","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_5d3934a1","line":97,"in_reply_to":"9f560f44_7a623e18","updated":"2020-08-18 12:33:11.000000000","message":"point 3 is certenly not true, we do care about live migration and refusing to add test does not help.\n\nyour current proposed approuch is not correct by design this is not condtional because all these field are required.\n\nif the vif type is not se or any other value above then it means there is an error earlier that has not been handled.\n\nwhen we construcnt the nova vif object we unconditionally recored the vif type in the object as well as the vnic_type, profile and binding details \nhttps://github.com/openstack/nova/blob/87269dcaeed7b0234d137bf61ec327703342c2a9/nova/network/neutron.py#L3068-L3072\n\nwhen we livemigate we take a different path by creating a set of new vif objects containing the source vifs(create_skeleton_migrate_vifs), \nthen create port binindg for the destiation host and update the binding form binding responce\n\nhttps://github.com/openstack/nova/blob/d4c857dfcb1ccfa5410de55671e69c722bbc990e/nova/conductor/tasks/live_migrate.py#L377-L383\n\n\n_update_migrate_vifs_from_bindings\n\njust loops over the bining reponce values and updates the vif objects with the reponce vlaues\n\n for migrate_vif in migrate_vifs:\n            for attr_name, attr_val in bindings[migrate_vif.port_id].items():\n                setattr(migrate_vif, attr_name, attr_val)\n\nso for the attirbute above to be unset it means the neutron binding reponce did not contian the require infomation.\n\nthat likely means the port biniding failed in some way.\n\ndoes vrouter actully impleiment the multiple port bidnign feature? initally the neutron change wehre ment to be don above the ml2 driver layear in the the service plugin but the driver actully need to implement a few functrions.\n\nvrouter has its own ml2 plugin/driver espcially wehn used with contrail. i suspect that it either does not support multiple port and neutron is incorrectly still reporting binding-extended extentions or there is a bug in the vrouter nueton plugin.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"570623a5b0732b4cdab91acd9dd178882318150d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_b31cefc1","line":97,"in_reply_to":"9f560f44_840d2b40","updated":"2020-08-19 12:19:06.000000000","message":"the nova and neutron specs were co written making it the responceibleity of the the ml2 driver and/or core plugin to report support for biding-extended.\n\nbefore we intoduced this exention allow multiple port bindings (one for the destination and another for the source)\nthe port binding were not updated until after the migration\n\nthis lead to long delays and prevented you form migrating between say ovs with ip tabels firewall and ovs with conntrack since the vif detail would not be avaiable when generating the xml on the source node.\n\nthere was a very deliberate effort by both the nova and neutron communities to develop a new protocol for port binding, we can differ on if it was a poor design or not (i disagree with your statement) the alternitive was to force all out of tree driver to adopt the new portcol in queens as we could not adress the gaps in migration without breaking them otherwiwse. \n\nit was and is expected that all driver will eventually suport the extnsion but having it be a spererate exteion allows a phased approch.\n\nwe have two code paths in nova for live migration,\nwe still support the legacy flow which does not update the vif detail until after the migration and we also support the modern workflow of using two bindings. it looks like the vrouter ml2 driver or core plugin has never adopted the modern workflow and the ml2 driver has a but where it is not filtering out support for it.\n\nthere are some other feature in nova that also only work if you support this extension. namely cross cell cold migration and resize.\n\nyou have not confirmed what vrouter backend you are using by the way, is it the core plugin or the ml2 driver.\nif its the ml2 driver the fix is trivial you need to filter the supported extensions in the ml2 driver to remove binding_extended from the list.\n\ngiven its been two years since this extension was introduced \nand that all ml2 driver and core plugins were expected to eventually  adopt it i find it odd that this has not already been fixed but ill bring it up with some nuetron folks i work with and ill see if we can poush to move this to a core extetion and required for all backend in W. that would allow us to drop the legacy code path in nova removing the conditionality.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"192d3dff4673d399a01f087e92872c17dab6397b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_57175f46","line":97,"in_reply_to":"9f560f44_9cc0fce2","updated":"2020-08-17 18:31:01.000000000","message":"\u003e 1. exactly like in this one https://review.opendev.org/#/c/738432/3\n\nNot really, that handles one probably legitimately optional field, not all the useful details of the VIF.\n\n \u003e 2. the problem vif and the target doesn\u0027t have a chance to obtain\n \u003e the attributes because of its construction method. the target\n \u003e builds it locally, doesn\u0027t use any data from the source. see the\n \u003e related code.\n\nThen those values should probably be set to None (and maybe be nullable\u003dTrue as a result).\n\n \u003e 3. u still have compatibility problem in vif related code because\n \u003e create path does send neutron events but migrate one doesn\u0027t.\n\nNot sure what this has to do with anything, but show me in tests!","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"408f166440431901ceb2beef2710c3cbe09b88ee","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_4764a8e5","line":97,"in_reply_to":"9f560f44_ad4f6bbb","updated":"2020-08-19 18:34:47.000000000","message":"oh, I\u0027ve got it finally, u speak about neutron plugins. then we have a core plugin for contrail now. I\u0027ve just tested a live migration with enabled binding-extended extension in the plugin and the op failed because of the unimplemented functions expected from the plugin claiming it supports the extension. thus there is no way to online migrate a vm now because VIFMigrateData instance is not populated with attributes, one always has to provide that extension functionality from plugin which is the same in most implementations. is there a reference one to copy-paste?","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"ec2647eec98ed15d6fe7cccd74c64b740c8c5a57","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_4d64cfe5","line":97,"in_reply_to":"9f560f44_b31cefc1","updated":"2020-08-19 14:13:30.000000000","message":"\u003e the nova and neutron specs were co written making it the\n \u003e responceibleity of the the ml2 driver and/or core plugin to report\n \u003e support for biding-extended.\n \u003e \n \u003e before we intoduced this exention allow multiple port bindings (one\n \u003e for the destination and another for the source)\n \u003e the port binding were not updated until after the migration\n \u003e \n \u003e this lead to long delays and prevented you form migrating between\n \u003e say ovs with ip tabels firewall and ovs with conntrack since the\n \u003e vif detail would not be avaiable when generating the xml on the\n \u003e source node.\n \u003e \n \u003e there was a very deliberate effort by both the nova and neutron\n \u003e communities to develop a new protocol for port binding, we can\n \u003e differ on if it was a poor design or not (i disagree with your\n \u003e statement) the alternitive was to force all out of tree driver to\n \u003e adopt the new portcol in queens as we could not adress the gaps in\n \u003e migration without breaking them otherwiwse.\n \u003e \n \u003e it was and is expected that all driver will eventually suport the\n \u003e extnsion but having it be a spererate exteion allows a phased\n \u003e approch.\n \u003e \n \u003e we have two code paths in nova for live migration,\n \u003e we still support the legacy flow which does not update the vif\n \u003e detail until after the migration and we also support the modern\n \u003e workflow of using two bindings. it looks like the vrouter ml2\n \u003e driver or core plugin has never adopted the modern workflow and the\n \u003e ml2 driver has a but where it is not filtering out support for it.\n \u003e \n \u003e there are some other feature in nova that also only work if you\n \u003e support this extension. namely cross cell cold migration and\n \u003e resize.\n \u003e \n \u003e you have not confirmed what vrouter backend you are using by the\n \u003e way, is it the core plugin or the ml2 driver.\n \u003e if its the ml2 driver the fix is trivial you need to filter the\n \u003e supported extensions in the ml2 driver to remove binding_extended\n \u003e from the list.\n \u003e \n \u003e given its been two years since this extension was introduced\n \u003e and that all ml2 driver and core plugins were expected to\n \u003e eventually  adopt it i find it odd that this has not already been\n \u003e fixed but ill bring it up with some nuetron folks i work with and\n \u003e ill see if we can poush to move this to a core extetion and\n \u003e required for all backend in W. that would allow us to drop the\n \u003e legacy code path in nova removing the conditionality.\n\nwe implemented a vif plugin only. there are no examples of constants.PORT_BINDING_EXTENDED use, btw, thus it is not obvious how to report its support from the plugin.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cabbfb7932b15cbf589ef9021f7bf946e35ee4a1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_86a98f7d","line":97,"in_reply_to":"9f560f44_b6dde615","updated":"2020-08-20 17:34:48.000000000","message":"just a quick updated\ni just spend the last couple of hours talking to artom about his bug and this one and we have reconfimred that\n\nhttps://opendev.org/openstack/nova/src/branch/master/nova/compute/manager.py#L7654-L7656\n\nwhich was introduced in train for sriov migration is the root cause of the bug.\n\nhttps://opendev.org/openstack/nova/commit/fd8fdc934530fb49497bc6deaa72adfa51c8783a\n\nmigrate_data.vifs was intoduced in rocky as part of the multiple port bindings as i said previously\n\nthere are several point in the code that use it as a proxy for testing if multiple portbindngs or the binding extended extions is supported.\n\nin train we broke that by always setting it.\n\nso the fix is to replace\n\nmigrate_data.vifs \u003d migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs(instance.get_network_info())\n\n\nwith \nif self.network_api.supports_port_binding_extension(ctxt)\nmigrate_data.vifs \u003d migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs(instance.get_network_info())\n\n\nthis was never seen upstream because all in tree neutron backends use ml2 and support this extention.\n\ni am going to try and create a functional repoducer for this  now","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"19eb719cce24a4d9cccffaa2790b5e47b16de8c2","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_1e1a0d7c","line":97,"in_reply_to":"9f560f44_de77f539","updated":"2020-08-18 19:33:35.000000000","message":"the frist code is what is used when the port is forst bound when the instace is intially booted. i liked to it to show that we always store the vif_type in the nova vif opbject which si stored in the network_info cache so yes i know its unrelated to live migration.\n\nthe vif_type for migration is set by https://github.com/openstack/nova/blob/d4c857dfcb1ccfa5410de55671e69c722bbc990e/nova/conductor/tasks/live_migrate.py#L433-L436\n\nthe use of setattr hides the what that code is doing but it is using the values in the port binding responce to update the vif object that was constructed.\n\ni use the word likely because the bug report does not provide enough detail to triage the bug. it only has the traceback not any of the related logs.\n\nthere may be other issue but this is not definetly unrelated to the multiple port bidinings feature since the vifs in the migrate data were added for multiple port bindings and is only used if we use that feature. so this is dreictly related to multiple port biding since this function and the related function you are modifying where added for multiple port bindings.\n\ni was initially going to mark it incomplete and ask you to provide the relevant logs but decied to hold off and wait for you to respond or provide a repdocuce test case for this issue as dan has already requested.\n\ncan you update the bug with the nova compute log for the instance that encountered the error and ideally the neutron server logs for the port binding request.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"ddf126201ab8a64147acae2e9306edc66c57d6a1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_840d2b40","line":97,"in_reply_to":"9f560f44_e4c98c78","updated":"2020-08-19 07:51:25.000000000","message":"\u003e https://github.com/Juniper/contrail-vrouter\n \u003e used to be the neutron itegration for vrouter.\n \u003e it has now moved to https://github.com/tungstenfabric/tf-neutron-plugin\n \u003e \n \u003e looking at the code base vrouter is integrated though what looks\n \u003e like a custom core plug-in instead of an ml2 driver.\n \u003e \n \u003e ml2 does not appear in the code base\n \u003e https://github.com/tungstenfabric/tf-neutron-plugin/search?q\u003dml2\u0026unscoped_q\u003dml2\n \u003e \n \u003e that means that the core plugin needs to implement\n \u003e https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/portbindings_extended.py\n \u003e explictly.\n \u003e \n \u003e \n \u003e the other way to integrate vrouter with openstack is to use\n \u003e https://opendev.org/x/networking-opencontrail/src/branch/master\n \u003e \n \u003e networking-opencontrail does not implement multiple port bindings\n \u003e as far as i can tell\n \u003e i dont see an implmentation of binding_activate or\n \u003e binding_deactivate\n \u003e \n \u003e https://opendev.org/openstack/neutron/src/branch/master/neutron/plugins/ml2/rpc.py#L481-L490\n \u003e \n \u003e the opencontrail ml2 driver\n \u003e https://opendev.org/x/networking-opencontrail/src/branch/master/networking_opencontrail/ml2/mech_driver.py#L35\n \u003e \n \u003e does not implement the supported_extensions method\n \u003e so it will report it support all extentions since that is the\n \u003e default implemnation it inherits\n \u003e \n \u003e https://github.com/openstack/neutron-lib/blob/96e1d028b84419d187f085b587e672447df00ae3/neutron_lib/plugins/ml2/api.py#L458-L471\n \u003e \n \u003e so again my guess is that if you are using networking-opencontrail\n \u003e neutron is still reporting binding-extended.\n \u003e \n \u003e in which case the responce form neutron may be invlaid resulting in\n \u003e the object not being populated.\n\nlook, vif mandatory attributes, u statement, are set conditionally depending on obscure neutron-based check for network_api.supports_port_binding_extension which means that these vif attributes are optional actually because otherwise there should be an unconditional execution path setting their values. worse the check means all the vifs are not eligible without supporting some extension - indicator of a poor design. and the last one, the migration task fails with an unhandled exception which also manifests some deep problem with overall code.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ff838723f2be81cf4634bf4725237fce1c75f6cb","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_b6dde615","line":97,"in_reply_to":"9f560f44_fb5bcc83","updated":"2020-08-20 13:46:27.000000000","message":"ok so there is a bug then. the code that is failing shoudl only be running if bining dextend is used so we need to find and fix that.\n\nget_dest_vif is only used for _update_vif_xml\n\nand _update_vif_xml should only be called when using binding-extended\n\nthis is what \n\nhttps://github.com/openstack/nova/blob/718dcf76de7ccdced97937075d8aa45c36ab1552/nova/virt/libvirt/migration.py#L64-L65\n\nis ment to be guarding althoug its indriect\n\nso for some reason we are entering \n\nhttps://opendev.org/openstack/nova/src/branch/master/nova/virt/libvirt/driver.py#L8932-L8955\n\nwhich means vifs is set in migrate_data\nbut that should only  be set if binding_extended is used.\n\n\nvif is only ever set here \n\nhttps://opendev.org/openstack/nova/src/branch/master/nova/compute/manager.py#L7654-L7656\n\ncheck_can_live_migrate_destination is called here\n\nhttps://opendev.org/openstack/nova/src/branch/master/nova/conductor/tasks/live_migrate.py#L361\n\n\nif we are doing sriov migration which is not your case we \nbefore we call check_can_live_migrate_destination we run  self._check_can_migrate_pci(self.source, destination)\n\nwhich checks for the port binding extention\n\nhttps://opendev.org/openstack/nova/src/branch/master/nova/conductor/tasks/live_migrate.py#L250-L254\n\nin the vrouter case the port binding extenion is checked after the vifs object is populated in the migrate data.\n\nhttps://opendev.org/openstack/nova/src/branch/master/nova/conductor/tasks/live_migrate.py#L371\n\nso we need to add an else staement that removes the vifs\nfrom self.migrate_data when its not support to make sure that code path that depens on multiple port binding and uses\nthe presence fo the vifs to determin if ti should run is not run.\n\nthat is the root cause of the bug you are hitting.\nill push a trival testing patch for that and you can see if it works for you","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"},{"author":{"_account_id":32220,"name":"Sergey Galas\u0027","email":"shrike_@mail.ru","username":"shrike"},"change_message_id":"85b05c54f6a33d2fc05eab89bab4f60c33cba58e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027profile_json\u0027 in self:"},{"line_number":95,"context_line":"            vif[\u0027profile\u0027] \u003d self.profile"},{"line_number":96,"context_line":"        if \u0027vif_details_json\u0027 in self:"},{"line_number":97,"context_line":"            vif[\u0027details\u0027] \u003d self.vif_details"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return vif"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_9cc0fce2","line":97,"in_reply_to":"9f560f44_fc83f802","updated":"2020-08-17 18:22:14.000000000","message":"1. exactly like in this one https://review.opendev.org/#/c/738432/3\n2. the problem vif and the target doesn\u0027t have a chance to obtain the attributes because of its construction method. the target builds it locally, doesn\u0027t use any data from the source. see the related code.\n3. u still have compatibility problem in vif related code because create path does send neutron events but migrate one doesn\u0027t.","commit_id":"3128e285bc7a27c2a3c39ebba5d9210294499b22"}],"nova/tests/functional/regressions/.#test_bug_1888395.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"910bd56a5a4e2273a51874372e2599fb046de788","unresolved":false,"context_lines":[{"line_number":1,"context_line":"ubuntu@numa-1.981883:1597188313"}],"source_content_type":"x-git/symlink","patch_set":8,"id":"9f560f44_d5e134d2","line":1,"updated":"2020-08-24 23:27:18.000000000","message":"wat","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d12c650af6b9d27a7c87efa4f5b4938255d86df6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"ubuntu@numa-1.981883:1597188313"}],"source_content_type":"x-git/symlink","patch_set":8,"id":"9f560f44_38822501","line":1,"in_reply_to":"9f560f44_d5e134d2","updated":"2020-08-25 02:16:49.000000000","message":"i added an emac temp file i think","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"}],"nova/tests/functional/regressions/test_bug_1888395.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"796c228eff6fd82f2bda3ce340d9207e1314898d","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # FIXME(sean-k-mooney): the fakelibvirt driver does not currently"},{"line_number":96,"context_line":"        # support live migration so this still wont work even though"},{"line_number":97,"context_line":"        # bug: #1888395 has been fixed but the error will change."},{"line_number":98,"context_line":"        # self._wait_for_server_parameter("},{"line_number":99,"context_line":"        #     server, {\u0027OS-EXT-SRV-ATTR:host\u0027: \u0027end_host\u0027, \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":100,"context_line":"        # so instead of asserting it migrated ^ we assert its still migrating"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f560f44_d594c7ea","line":97,"updated":"2020-09-07 13:45:23.000000000","message":"Based on the idea of nova.virt.fake.FakeLiveMigrateDriver you could create a driver derivative that finishes the migration.","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # FIXME(sean-k-mooney): the fakelibvirt driver does not currently"},{"line_number":96,"context_line":"        # support live migration so this still wont work even though"},{"line_number":97,"context_line":"        # bug: #1888395 has been fixed but the error will change."},{"line_number":98,"context_line":"        # self._wait_for_server_parameter("},{"line_number":99,"context_line":"        #     server, {\u0027OS-EXT-SRV-ATTR:host\u0027: \u0027end_host\u0027, \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":100,"context_line":"        # so instead of asserting it migrated ^ we assert its still migrating"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f560f44_e2514e10","line":97,"in_reply_to":"9f560f44_d594c7ea","updated":"2020-09-07 16:53:57.000000000","message":"Fortunately we have prior art for this :) You need to stub out libvirt\u0027s \u0027migrateToURI3\u0027. See [1] for an example. Alternatively, look at artom\u0027s work in [2] which [1] is based on.\n\nEventually this should move to fakelibvirt, but let\u0027s wait til all three things are merged before doing that cleanup\n\n[1] https://review.opendev.org/#/c/746950/6/nova/tests/functional/libvirt/test_pci_sriov_servers.py\n[2] nova/tests/functional/libvirt/test_numa_live_migration.py","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b7a2985e7a2915d5456c9c58c1752ed25a38756a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                kB_mem\u003d10740000)})"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":73,"context_line":"        # TODO(sean-k-mooney): remove this when it is part of ServersTestBase"},{"line_number":74,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":75,"context_line":"            \u0027nova.tests.unit.virt.libvirt.fakelibvirt.Domain.migrateToURI3\u0027,"},{"line_number":76,"context_line":"            self._migrate_stub))"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":79,"context_line":"        \"\"\"Stub out migrateToURI3.\"\"\""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        src_hostname \u003d domain._connection.hostname"},{"line_number":82,"context_line":"        dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        # In a real live migration, libvirt and QEMU on the source and"},{"line_number":85,"context_line":"        # destination talk it out, resulting in the instance starting to exist"},{"line_number":86,"context_line":"        # on the destination. Fakelibvirt cannot do that, so we have to"},{"line_number":87,"context_line":"        # manually create the \"incoming\" instance on the destination"},{"line_number":88,"context_line":"        # fakelibvirt."},{"line_number":89,"context_line":"        dst \u003d self.computes[dst_hostname]"},{"line_number":90,"context_line":"        dst.driver._host.get_connection().createXML("},{"line_number":91,"context_line":"            params[\u0027destination_xml\u0027],"},{"line_number":92,"context_line":"            \u0027fake-createXML-doesnt-care-about-flags\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        src \u003d self.computes[src_hostname]"},{"line_number":95,"context_line":"        conn \u003d src.driver._host.get_connection()"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # because migrateToURI3 is spawned in a background thread, this method"},{"line_number":98,"context_line":"        # does not block the upper nova layers. Because we don\u0027t want nova to"},{"line_number":99,"context_line":"        # think the live migration has finished until this method is done, the"},{"line_number":100,"context_line":"        # last thing we do is make fakelibvirt\u0027s Domain.jobStats() return"},{"line_number":101,"context_line":"        # VIR_DOMAIN_JOB_COMPLETED."},{"line_number":102,"context_line":"        server \u003d etree.fromstring("},{"line_number":103,"context_line":"            params[\u0027destination_xml\u0027]"},{"line_number":104,"context_line":"        ).find(\u0027./uuid\u0027).text"},{"line_number":105,"context_line":"        dom \u003d conn.lookupByUUIDString(server)"},{"line_number":106,"context_line":"        dom.complete_job()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def test_live_migrate(self):"},{"line_number":109,"context_line":"        server \u003d self._create_server("}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_28efa51d","line":106,"range":{"start_line":73,"start_character":0,"end_line":106,"end_character":26},"updated":"2020-09-07 21:23:56.000000000","message":"note this is directly taken form Stephen\u0027s patch\n\nhttps://review.opendev.org/#/c/746950/6/nova/tests/functional/libvirt/test_pci_sriov_servers.py@120\n\nbut i want to back port this separately from his changes so its copied inline and we can converge them later on master.","commit_id":"b8f3be6b3c5af91d215b4a0cecb9be098e8d8799"}],"releasenotes/notes/restore-rocky-portbinding-semantics-48e9b1fa969cc5e9.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"728e2e05d8e008998d1df6b7d7a411a60b12ba3c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (--.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (--.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the migration_data"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9f560f44_7cdde36e","line":4,"range":{"start_line":4,"start_character":16,"end_line":4,"end_character":25},"updated":"2020-08-21 00:34:46.000000000","message":"ill fill this in the next time this is updated","commit_id":"303cd86344def7ed8bbaa1250f54e96012355d9b"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"910bd56a5a4e2273a51874372e2599fb046de788","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (--.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (--.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the migration_data"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f560f44_35e510dd","line":4,"range":{"start_line":4,"start_character":17,"end_line":4,"end_character":25},"updated":"2020-08-24 23:27:18.000000000","message":"???","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d12c650af6b9d27a7c87efa4f5b4938255d86df6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (--.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (--.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the migration_data"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f560f44_1885a107","line":4,"range":{"start_line":4,"start_character":17,"end_line":4,"end_character":25},"in_reply_to":"9f560f44_35e510dd","updated":"2020-08-25 02:16:49.000000000","message":"oh ya i forgot to fill this in\n\nthis would be 18.0.0","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"910bd56a5a4e2273a51874372e2599fb046de788","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (--.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (--.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the migration_data"},{"line_number":8,"context_line":"    object that signals if the new multiple port binding workflow should"},{"line_number":9,"context_line":"    be used by always populating it even when the binding-extended API"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f560f44_15e8ccb0","line":6,"range":{"start_line":6,"start_character":31,"end_line":6,"end_character":39},"updated":"2020-08-24 23:27:18.000000000","message":"o_O","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d12c650af6b9d27a7c87efa4f5b4938255d86df6","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (--.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (--.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the migration_data"},{"line_number":8,"context_line":"    object that signals if the new multiple port binding workflow should"},{"line_number":9,"context_line":"    be used by always populating it even when the binding-extended API"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f560f44_587a7923","line":6,"range":{"start_line":6,"start_character":31,"end_line":6,"end_character":39},"in_reply_to":"9f560f44_15e8ccb0","updated":"2020-08-25 02:16:49.000000000","message":"and 20.0.0","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"910bd56a5a4e2273a51874372e2599fb046de788","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    In the Rocky (--.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (--.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the migration_data"},{"line_number":8,"context_line":"    object that signals if the new multiple port binding workflow should"},{"line_number":9,"context_line":"    be used by always populating it even when the binding-extended API"},{"line_number":10,"context_line":"    extension is not present. This broke live migration for any deployment"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f560f44_95d33c01","line":7,"range":{"start_line":7,"start_character":57,"end_line":7,"end_character":71},"updated":"2020-08-24 23:27:18.000000000","message":"`migrate_data`, and I think Stephen will want proper RST formatting for monospace/code (we can do that in release notes, right?)","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d12c650af6b9d27a7c87efa4f5b4938255d86df6","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    In the Rocky (--.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (--.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the migration_data"},{"line_number":8,"context_line":"    object that signals if the new multiple port binding workflow should"},{"line_number":9,"context_line":"    be used by always populating it even when the binding-extended API"},{"line_number":10,"context_line":"    extension is not present. This broke live migration for any deployment"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f560f44_3897c53c","line":7,"range":{"start_line":7,"start_character":57,"end_line":7,"end_character":71},"in_reply_to":"9f560f44_95d33c01","updated":"2020-08-25 02:16:49.000000000","message":"literals i think are ``thing`` but maybe its just `thing`\n\nthat said i dont know if we need that ere or not.\n\nand yes we can use format rst here and some but not all sphinx extension. mainly we cant reference auto generated docs sections like config.","commit_id":"f1be723989a7e72bfd19a79245a71c1104ca5289"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (18.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (20.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the ``migration_data``"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9f560f44_623d3eba","line":4,"range":{"start_line":4,"start_character":10,"end_line":4,"end_character":25},"updated":"2020-09-07 16:53:57.000000000","message":"18.0.0 (Rocky)","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b42e97ac97b5f64bccfeeca13e27fae8b9d5acbc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (18.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (20.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the ``migration_data``"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9f560f44_2de697b1","line":4,"range":{"start_line":4,"start_character":10,"end_line":4,"end_character":25},"in_reply_to":"9f560f44_623d3eba","updated":"2020-09-07 20:22:23.000000000","message":"i really prefer doing it this way.\nno one remembers the numbers and they are different between project so i want the release name to be the primary reference.","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the Rocky (18.0.0) release support was added to nova to use neutron\u0027s"},{"line_number":5,"context_line":"    multiple port binding feature when the binding-extended API extension"},{"line_number":6,"context_line":"    is available. In the Train (20.0.0) release the SR-IOV live migration"},{"line_number":7,"context_line":"    feature broke the semantics of the vifs field in the ``migration_data``"},{"line_number":8,"context_line":"    object that signals if the new multiple port binding workflow should"},{"line_number":9,"context_line":"    be used by always populating it even when the ``binding-extended`` API"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9f560f44_a243d63e","line":6,"range":{"start_line":6,"start_character":25,"end_line":6,"end_character":40},"updated":"2020-09-07 16:53:57.000000000","message":"20.0.0 (Train)","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    be used by always populating it even when the ``binding-extended`` API"},{"line_number":10,"context_line":"    extension is not present. This broke live migration for any deployment"},{"line_number":11,"context_line":"    that did not support the optional ``binding-extended`` API extension."},{"line_number":12,"context_line":"    The rocky behavior has now been resorted enabling live migration"},{"line_number":13,"context_line":"    using the single port binding workflow when multiple port bindings"},{"line_number":14,"context_line":"    are not available."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9f560f44_027602a5","line":12,"range":{"start_line":12,"start_character":8,"end_line":12,"end_character":13},"updated":"2020-09-07 16:53:57.000000000","message":"Rocky","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"47b2092c03875de6a69b610c1b7707a2c8bc0c99","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    be used by always populating it even when the ``binding-extended`` API"},{"line_number":10,"context_line":"    extension is not present. This broke live migration for any deployment"},{"line_number":11,"context_line":"    that did not support the optional ``binding-extended`` API extension."},{"line_number":12,"context_line":"    The rocky behavior has now been resorted enabling live migration"},{"line_number":13,"context_line":"    using the single port binding workflow when multiple port bindings"},{"line_number":14,"context_line":"    are not available."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9f560f44_426c7acf","line":12,"range":{"start_line":12,"start_character":36,"end_line":12,"end_character":44},"updated":"2020-09-07 16:53:57.000000000","message":"restored","commit_id":"b8d27a742de06344693cd6a64ff08eba42a5f0f8"}]}
