)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"73d72fa806251162a6159968074272a86fa76c5b","unresolved":false,"context_lines":[{"line_number":10,"context_line":"qos ports. It covers live migration with target host specified and"},{"line_number":11,"context_line":"re-schedule success and failure cases."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"There are two non test code changes."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"1)"},{"line_number":16,"context_line":"In the check_can_live_migrate_destination compute manager method CONF.host"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_485fd10e","line":13,"range":{"start_line":13,"start_character":14,"end_line":13,"end_character":22},"updated":"2019-12-23 13:10:17.000000000","message":"non-test","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"73d72fa806251162a6159968074272a86fa76c5b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"the above call runs on host2 the CONF.host is already set to host3 as"},{"line_number":22,"context_line":"that host was started later in the test. Fortunately self.host is"},{"line_number":23,"context_line":"set on the compute manage during the compute startup so it is correct in"},{"line_number":24,"context_line":"the functional test env too. It is unfortunate that we have to change"},{"line_number":25,"context_line":"non test code to make the test code work but the global CONF variable is"},{"line_number":26,"context_line":"a hard problem to resolve."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"2)"},{"line_number":29,"context_line":"The InstancePCIRequest is saved in the LiveMigrationTask as the task"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_c8798182","line":26,"range":{"start_line":24,"start_character":29,"end_line":26,"end_character":26},"updated":"2019-12-23 13:10:17.000000000","message":"Been there, done that :( https://review.opendev.org/#/c/683961/","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"2)"},{"line_number":29,"context_line":"The InstancePCIRequest is saved in the LiveMigrationTask as the task"},{"line_number":30,"context_line":"updates the request for each host it tries to move the instance. If non"},{"line_number":31,"context_line":"of the destination supports the migration then the rollback() of the"},{"line_number":32,"context_line":"task will restore the InstancePCIRequest to its original value as the"},{"line_number":33,"context_line":"instance will remain on the source host."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_362a042f","line":30,"range":{"start_line":30,"start_character":68,"end_line":30,"end_character":71},"updated":"2019-12-20 16:12:34.000000000","message":"none\n\n--\n\n\"via update_pci_request_spec_with_allocated_interface_name.\" for context","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"}],"nova/conductor/tasks/live_migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":"import copy"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from oslo_log import log as logging"},{"line_number":15,"context_line":"import oslo_messaging as messaging"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_d6c6106a","line":12,"updated":"2019-12-20 16:12:34.000000000","message":"We can avoid this...","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                                      self.migration))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # NOTE(gibi): migrating with qos SRIOV ports will update the PCI"},{"line_number":88,"context_line":"        # request so we saving the request here so that we can roll that change"},{"line_number":89,"context_line":"        # back if the migration fails."},{"line_number":90,"context_line":"        self.instance_pci_request \u003d copy.deepcopy(self.instance.pci_requests)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_f6230c57","line":88,"range":{"start_line":88,"start_character":24,"end_line":88,"end_character":30},"updated":"2019-12-20 16:12:34.000000000","message":"save","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        # NOTE(gibi): migrating with qos SRIOV ports will update the PCI"},{"line_number":88,"context_line":"        # request so we saving the request here so that we can roll that change"},{"line_number":89,"context_line":"        # back if the migration fails."},{"line_number":90,"context_line":"        self.instance_pci_request \u003d copy.deepcopy(self.instance.pci_requests)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not self.destination:"},{"line_number":93,"context_line":"            # Either no host was specified in the API request and the user"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_f67f8c14","line":90,"range":{"start_line":90,"start_character":36,"end_line":90,"end_character":49},"updated":"2019-12-20 16:12:34.000000000","message":"...if you use self.instance.pci_requests.obj_clone()\n\nHowever, instance.pci_requests is nullable so if this is None copy.deepcopy(None) will work OK but self.instance.pci_requests.obj_clone() would blow up with a NoneType error so I guess forget about that.","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        # NOTE(gibi): migrating with qos SRIOV ports will update the PCI"},{"line_number":88,"context_line":"        # request so we saving the request here so that we can roll that change"},{"line_number":89,"context_line":"        # back if the migration fails."},{"line_number":90,"context_line":"        self.instance_pci_request \u003d copy.deepcopy(self.instance.pci_requests)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not self.destination:"},{"line_number":93,"context_line":"            # Either no host was specified in the API request and the user"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_96e73810","line":90,"updated":"2019-12-20 16:12:34.000000000","message":"The instance.pci_requests are only modified if update_pci_request_spec_with_allocated_interface_name is called which only happens in _find_destination so we could/should move this into the \"if not self.destination:\" block below to save (1) the copy here and (2) the rollback work later if we hit it.","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7289,"context_line":"            server, qos_normal_port, qos_sriov_port)"},{"line_number":7290,"context_line":""},{"line_number":7291,"context_line":"    def test_live_migrate_with_qos_port_with_target_host(self):"},{"line_number":7292,"context_line":"        self.test_live_migrate_with_qos_port(host\u003d\u0027host2\u0027)"},{"line_number":7293,"context_line":""},{"line_number":7294,"context_line":"    def test_live_migrate_with_qos_port_reschedule_success(self):"},{"line_number":7295,"context_line":"        # TODO(gibi): remove this when live migration is fully supported and"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_36d9a427","line":7292,"updated":"2019-12-20 16:12:34.000000000","message":"At first I expected this to fail but since we\u0027re using the latest microversion and force isn\u0027t in the request, this is a requested destination rather than a forced destination so that\u0027s why it still works. It\u0027ll still run through the _find_destination code as well but the scheduler should only return that one host.","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7317,"context_line":""},{"line_number":7318,"context_line":"        def fake_check_can_live_migrate_destination("},{"line_number":7319,"context_line":"                context, instance, src_compute_info, dst_compute_info,"},{"line_number":7320,"context_line":"                block_migration\u003dFalse, disk_over_commit\u003dFalse):"},{"line_number":7321,"context_line":"            if dst_compute_info[\u0027host\u0027] \u003d\u003d \u0027host2\u0027:"},{"line_number":7322,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":7323,"context_line":"                    reason\u003d\u0027test_live_migrate_pre_check_fails\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_36276421","line":7320,"range":{"start_line":7320,"start_character":16,"end_line":7320,"end_character":61},"updated":"2019-12-20 16:12:34.000000000","message":"I was going to say we could future proof this a bit by using *args and **kwargs for the rest of the parameters you don\u0027t care about, but it\u0027s not a big deal. This driver interface shouldn\u0027t change much.","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7320,"context_line":"                block_migration\u003dFalse, disk_over_commit\u003dFalse):"},{"line_number":7321,"context_line":"            if dst_compute_info[\u0027host\u0027] \u003d\u003d \u0027host2\u0027:"},{"line_number":7322,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":7323,"context_line":"                    reason\u003d\u0027test_live_migrate_pre_check_fails\u0027)"},{"line_number":7324,"context_line":"            else:"},{"line_number":7325,"context_line":"                return orig_check("},{"line_number":7326,"context_line":"                    context, instance, src_compute_info, dst_compute_info,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_76ef1cb1","line":7323,"range":{"start_line":7323,"start_character":28,"end_line":7323,"end_character":61},"updated":"2019-12-20 16:12:34.000000000","message":"nit: looks like this was copied, probably better to use test_live_migrate_with_qos_port_reschedule_success here.","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7324,"context_line":"            else:"},{"line_number":7325,"context_line":"                return orig_check("},{"line_number":7326,"context_line":"                    context, instance, src_compute_info, dst_compute_info,"},{"line_number":7327,"context_line":"                    block_migration, disk_over_commit)"},{"line_number":7328,"context_line":""},{"line_number":7329,"context_line":"        with mock.patch(\u0027nova.virt.fake.FakeDriver.\u0027"},{"line_number":7330,"context_line":"                        \u0027check_can_live_migrate_destination\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_f630ec57","line":7327,"range":{"start_line":7327,"start_character":20,"end_line":7327,"end_character":53},"updated":"2019-12-20 16:12:34.000000000","message":"nit: probably good to use named kwargs here","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7338,"context_line":"                    }"},{"line_number":7339,"context_line":"                }"},{"line_number":7340,"context_line":"            )"},{"line_number":7341,"context_line":"            # The first migration attempt was to host2. So we expect that the"},{"line_number":7342,"context_line":"            # instance lands on host3."},{"line_number":7343,"context_line":"            self._wait_for_server_parameter("},{"line_number":7344,"context_line":"                server,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_3610c4ab","line":7341,"updated":"2019-12-20 16:12:34.000000000","message":"And the order works here because of HostNameWeigherFixture, got it.","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7355,"context_line":"    def test_live_migrate_with_qos_port_reschedule_fails(self):"},{"line_number":7356,"context_line":"        # TODO(gibi): remove this when live migration is fully supported and"},{"line_number":7357,"context_line":"        # therefore the check is removed from the api"},{"line_number":7358,"context_line":"        self._turn_off_api_check()"},{"line_number":7359,"context_line":""},{"line_number":7360,"context_line":"        non_qos_normal_port \u003d self.neutron.port_1"},{"line_number":7361,"context_line":"        qos_normal_port \u003d self.neutron.port_with_resource_request"},{"line_number":7362,"context_line":"        qos_sriov_port \u003d self.neutron.port_with_sriov_resource_request"},{"line_number":7363,"context_line":""},{"line_number":7364,"context_line":"        server \u003d self._create_server_with_ports("},{"line_number":7365,"context_line":"            non_qos_normal_port, qos_normal_port, qos_sriov_port)"},{"line_number":7366,"context_line":""},{"line_number":7367,"context_line":"        # check that the server allocates from the current host properly"},{"line_number":7368,"context_line":"        self._check_allocation("},{"line_number":7369,"context_line":"            server, self.compute1_rp_uuid, non_qos_normal_port,"},{"line_number":7370,"context_line":"            qos_normal_port, qos_sriov_port, self.flavor_with_group_policy)"},{"line_number":7371,"context_line":""},{"line_number":7372,"context_line":"        with mock.patch("},{"line_number":7373,"context_line":"                \u0027nova.virt.fake.FakeDriver.check_can_live_migrate_destination\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_160d888e","line":7370,"range":{"start_line":7358,"start_character":8,"end_line":7370,"end_character":75},"updated":"2019-12-20 16:12:34.000000000","message":"nit: could move some of this boilerplate copy/paste setup code into a helper function within the test class to DRY up some of these tests.","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7372,"context_line":"        with mock.patch("},{"line_number":7373,"context_line":"                \u0027nova.virt.fake.FakeDriver.check_can_live_migrate_destination\u0027,"},{"line_number":7374,"context_line":"                side_effect\u003dexception.MigrationPreCheckError("},{"line_number":7375,"context_line":"                    reason\u003d\u0027test_live_migrate_pre_check_fails\u0027)):"},{"line_number":7376,"context_line":"            self.api.post_server_action("},{"line_number":7377,"context_line":"                server[\u0027id\u0027],"},{"line_number":7378,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_36752401","line":7375,"range":{"start_line":7375,"start_character":28,"end_line":7375,"end_character":61},"updated":"2019-12-20 16:12:34.000000000","message":"same as above, use test_live_migrate_with_qos_port_reschedule_fails here?","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76bd4a78f71ad21f1415f78a651a1f627ed7f990","unresolved":false,"context_lines":[{"line_number":7382,"context_line":"                    }"},{"line_number":7383,"context_line":"                }"},{"line_number":7384,"context_line":"            )"},{"line_number":7385,"context_line":"            # The every migration target host will fail the pre check so"},{"line_number":7386,"context_line":"            # the conductor will run out of target host and the migration will"},{"line_number":7387,"context_line":"            # fail"},{"line_number":7388,"context_line":"            self._wait_for_migration_status(server, [\u0027error\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_5678e0f5","line":7385,"range":{"start_line":7385,"start_character":14,"end_line":7385,"end_character":23},"updated":"2019-12-20 16:12:34.000000000","message":"Every","commit_id":"5f63ada309f562f3ffe9b75b6f1acf1efb80ee4e"}]}
