)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"9873e73b23610f033972c03342a7055581fe72e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ea6b4bd4_9207adba","updated":"2024-05-10 07:45:22.000000000","message":"thanks for this tests, really good idea. Please check if the test works with virtual host restart/shut down?","commit_id":"9920738e037b255b107323c6b069ce76bbe92295"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"a79bb53269d6dd47c80acd4cd8081775eb8f40cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8cbde4ca_a655144c","updated":"2024-05-24 07:06:53.000000000","message":"recheck","commit_id":"5aae5e85b4f0878c5ccd621852331ca2205e0b22"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"ee95fabec71cf3cd657ca72bede5e980f0f9db0b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a8f45a8e_25932cb9","updated":"2024-05-23 20:20:57.000000000","message":"recheck","commit_id":"5aae5e85b4f0878c5ccd621852331ca2205e0b22"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"59c2167015a7f072e1f40eadccdb40f73148081b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"168a163e_e962224b","updated":"2024-05-31 01:15:51.000000000","message":"Very nice work, thank you.\n\n-1 just for a small improvement.","commit_id":"a6d678d5602f5b894b3f5033d5cdec06e169fc6a"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"077300582cac1e796c93d928c549d4fff471ff76","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9f899003_249cb0e7","updated":"2024-05-30 10:40:24.000000000","message":"recheck","commit_id":"a6d678d5602f5b894b3f5033d5cdec06e169fc6a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"add808359d31c35822be4cfca959efe33fe29c4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"6e4bb10b_7f4b3782","updated":"2024-06-06 13:27:36.000000000","message":"recheck","commit_id":"3becb09c42b149943ed22d1fe4c061682d895dc4"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e3c720135d98b916163d6aa45d7fa1aba153caa1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"6bce2403_ab5baa5e","updated":"2024-07-09 11:25:13.000000000","message":"Looks ok","commit_id":"f9a54350e6b77dcb03a6e1eeedb547f276813c99"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"4eb092301f90febf2de225a10311e209c52d8bf3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0e6b9219_19d8582b","updated":"2024-06-19 07:36:57.000000000","message":"recheck","commit_id":"f9a54350e6b77dcb03a6e1eeedb547f276813c99"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"def920f38295ae057ed148419eb3d7c5118c4bf0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8ee6cfa2_1bdab5d2","updated":"2024-06-20 13:27:09.000000000","message":"recheck","commit_id":"f9a54350e6b77dcb03a6e1eeedb547f276813c99"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"aee67d1ce1e6150c26b91590ec4c1b59e0130cd3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"b2900688_da67c4ee","updated":"2024-09-06 17:09:11.000000000","message":"recheck \"This build does not provide any logs\" + not fullstack failure","commit_id":"f9a54350e6b77dcb03a6e1eeedb547f276813c99"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"0bcb19ab6a9369877126502403fb3331890dd1c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"231c952f_8759a56a","updated":"2024-07-09 19:55:07.000000000","message":"recheck connection refused from github","commit_id":"f9a54350e6b77dcb03a6e1eeedb547f276813c99"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"1def17ad2e85ee46dfdebfbc74401575f57f8e07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"a5569eca_14d0e024","updated":"2024-07-15 11:54:44.000000000","message":"recheck unrelated  neutron-tempest-plugin-designate-scenario and neutron-fullstack-with-uwsgi","commit_id":"f9a54350e6b77dcb03a6e1eeedb547f276813c99"}],"neutron/tests/fullstack/base.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ca2a265a28acb4639002b7e1bd02c8f1e19b6c78","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        available_ips \u003d itertools.islice(valid_ips, initial, initial + num)"},{"line_number":166,"context_line":"        return [str(available_ip) for available_ip in available_ips]"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _create_external_vm(self, network, subnet\u003dNone, ip\u003dNone):"},{"line_number":169,"context_line":"        ip \u003d ip or subnet[\u0027gateway_ip\u0027]"},{"line_number":170,"context_line":"        vm \u003d self.useFixture("},{"line_number":171,"context_line":"            machine_fixtures.FakeMachine("}],"source_content_type":"text/x-python","patch_set":1,"id":"de34a1bf_547aefe8","line":168,"range":{"start_line":168,"start_character":43,"end_line":168,"end_character":55},"updated":"2024-05-07 02:56:40.000000000","message":"Should not change the exsiting param default value to None. And not make it optional. If new callers just call this with _create_external_vm(network), None type error will raise on line 169.","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"a6c3302ea42930f734ed085c262e9d81965fcbc2","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        available_ips \u003d itertools.islice(valid_ips, initial, initial + num)"},{"line_number":166,"context_line":"        return [str(available_ip) for available_ip in available_ips]"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _create_external_vm(self, network, subnet\u003dNone, ip\u003dNone):"},{"line_number":169,"context_line":"        ip \u003d ip or subnet[\u0027gateway_ip\u0027]"},{"line_number":170,"context_line":"        vm \u003d self.useFixture("},{"line_number":171,"context_line":"            machine_fixtures.FakeMachine("}],"source_content_type":"text/x-python","patch_set":1,"id":"d31b8ce2_acbcee93","line":168,"range":{"start_line":168,"start_character":43,"end_line":168,"end_character":55},"in_reply_to":"de34a1bf_547aefe8","updated":"2024-05-08 10:08:06.000000000","message":"Done","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"}],"neutron/tests/fullstack/test_l3_agent.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ca2a265a28acb4639002b7e1bd02c8f1e19b6c78","unresolved":true,"context_lines":[{"line_number":476,"context_line":"        # Ensure connectivity before disconnect"},{"line_number":477,"context_line":"        vm.block_until_ping(external.ip)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        active_host \u003d self._get_host_for_active_ha_router_replica(router_id)"},{"line_number":480,"context_line":"        active_host.disconnect()"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"        # Ensure connectivity is shortly lost on failover and recovers"},{"line_number":483,"context_line":"        vm.assert_no_ping(external.ip)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e9cc5b43_9996d113","line":480,"range":{"start_line":479,"start_character":0,"end_line":480,"end_character":32},"updated":"2024-05-07 02:56:40.000000000","message":"Accodring to the implementation of \"disconnect\", seems the router will be double ACTIVE mode? Because the VRRP processes are still running, all VRRP processing can become master because the heartbeat not received from others. Please check the DB master and backup state as well here.\n\nThe right way to simulate the failover is to kill the keepalived VRRP process of the running master. Or directly shut down the fake host, like the physical host poweroff.","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"9873e73b23610f033972c03342a7055581fe72e5","unresolved":true,"context_lines":[{"line_number":476,"context_line":"        # Ensure connectivity before disconnect"},{"line_number":477,"context_line":"        vm.block_until_ping(external.ip)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        active_host \u003d self._get_host_for_active_ha_router_replica(router_id)"},{"line_number":480,"context_line":"        active_host.disconnect()"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"        # Ensure connectivity is shortly lost on failover and recovers"},{"line_number":483,"context_line":"        vm.assert_no_ping(external.ip)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9e87658e_398c3a91","line":480,"range":{"start_line":479,"start_character":0,"end_line":480,"end_character":32},"in_reply_to":"54392ff9_e46fb235","updated":"2024-05-10 07:45:22.000000000","message":"I agree with Liu that to see a host shut down test would be good, could you please check if that is feasable?","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"80dce61a598224ea1e450c979324e68db77f3d27","unresolved":false,"context_lines":[{"line_number":476,"context_line":"        # Ensure connectivity before disconnect"},{"line_number":477,"context_line":"        vm.block_until_ping(external.ip)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        active_host \u003d self._get_host_for_active_ha_router_replica(router_id)"},{"line_number":480,"context_line":"        active_host.disconnect()"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"        # Ensure connectivity is shortly lost on failover and recovers"},{"line_number":483,"context_line":"        vm.assert_no_ping(external.ip)"}],"source_content_type":"text/x-python","patch_set":1,"id":"31eb347d_9080b068","line":480,"range":{"start_line":479,"start_character":0,"end_line":480,"end_character":32},"in_reply_to":"9e87658e_398c3a91","updated":"2024-05-16 13:04:48.000000000","message":"I implemented tests for graceful host shutdown and killing the host. To be able to do this I had to rework how the daemon processes are started so that it\u0027s possible to kill all related processes. I implemented this as a separate change, but if you prefer I can also merge it into this change.\n\nhttps://review.opendev.org/c/openstack/neutron/+/919834","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"a6c3302ea42930f734ed085c262e9d81965fcbc2","unresolved":true,"context_lines":[{"line_number":476,"context_line":"        # Ensure connectivity before disconnect"},{"line_number":477,"context_line":"        vm.block_until_ping(external.ip)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        active_host \u003d self._get_host_for_active_ha_router_replica(router_id)"},{"line_number":480,"context_line":"        active_host.disconnect()"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"        # Ensure connectivity is shortly lost on failover and recovers"},{"line_number":483,"context_line":"        vm.assert_no_ping(external.ip)"}],"source_content_type":"text/x-python","patch_set":1,"id":"54392ff9_e46fb235","line":480,"range":{"start_line":479,"start_character":0,"end_line":480,"end_character":32},"in_reply_to":"e9cc5b43_9996d113","updated":"2024-05-08 10:08:06.000000000","message":"The current implementation simulates a network failure. Which is another common scenario for a failover. Ideally we could write tests for the network failure and host failure scenarios, but I could not find a good way to simulate the host failure. Just calling `active_host.cleanUp()` does not actually kill the keepalived processes. And I did not find a good way to kill them from the test process (because they are started by the L3 agent process).","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ca2a265a28acb4639002b7e1bd02c8f1e19b6c78","unresolved":true,"context_lines":[{"line_number":489,"context_line":"        lost \u003d pinger.sent - pinger.received"},{"line_number":490,"context_line":"        message \u003d (f\u0027Sent {pinger.sent} packets, received {pinger.received} \u0027"},{"line_number":491,"context_line":"                   f\u0027packets, lost {lost} packets\u0027)"},{"line_number":492,"context_line":"        assert lost \u003c 90, message"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def _get_keepalived_state(self, keepalived_state_file):"},{"line_number":495,"context_line":"        with open(keepalived_state_file, \"r\") as fd:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3b3424f1_90242172","line":492,"range":{"start_line":492,"start_character":8,"end_line":492,"end_character":33},"updated":"2024-05-07 02:56:40.000000000","message":"\"assert\" is not widely in neutron test code, this can be: self.assertLess(lost, 90, message)","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"a6c3302ea42930f734ed085c262e9d81965fcbc2","unresolved":false,"context_lines":[{"line_number":489,"context_line":"        lost \u003d pinger.sent - pinger.received"},{"line_number":490,"context_line":"        message \u003d (f\u0027Sent {pinger.sent} packets, received {pinger.received} \u0027"},{"line_number":491,"context_line":"                   f\u0027packets, lost {lost} packets\u0027)"},{"line_number":492,"context_line":"        assert lost \u003c 90, message"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def _get_keepalived_state(self, keepalived_state_file):"},{"line_number":495,"context_line":"        with open(keepalived_state_file, \"r\") as fd:"}],"source_content_type":"text/x-python","patch_set":1,"id":"de6c63db_d16f727c","line":492,"range":{"start_line":492,"start_character":8,"end_line":492,"end_character":33},"in_reply_to":"3b3424f1_90242172","updated":"2024-05-08 10:08:06.000000000","message":"Done","commit_id":"bd9ba680471c133f64f54553711437e4d42df000"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"59c2167015a7f072e1f40eadccdb40f73148081b","unresolved":true,"context_lines":[{"line_number":645,"context_line":"            \u0027external_fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"        l3_agents \u003d [host.agents[\u0027l3\u0027] for host in self.environment.hosts]"},{"line_number":648,"context_line":"        l3_standby_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":649,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027standby\u0027)"},{"line_number":650,"context_line":"        l3_active_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":651,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027active\u0027)"},{"line_number":652,"context_line":"        self.assertEqual(1, len(l3_active_agents))"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        # Let\u0027s check first if connectivity from external_vm to router\u0027s"},{"line_number":655,"context_line":"        # external gateway IP is possible before we restart agents"}],"source_content_type":"text/x-python","patch_set":6,"id":"daed90f1_5202f9ab","line":652,"range":{"start_line":648,"start_character":0,"end_line":652,"end_character":50},"updated":"2024-05-31 01:15:51.000000000","message":"Could you add some router active/standby state check like these lines in the new cases?","commit_id":"a6d678d5602f5b894b3f5033d5cdec06e169fc6a"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"1488520e32bcd5f29c4f34cd1e45b5028866c175","unresolved":false,"context_lines":[{"line_number":645,"context_line":"            \u0027external_fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"        l3_agents \u003d [host.agents[\u0027l3\u0027] for host in self.environment.hosts]"},{"line_number":648,"context_line":"        l3_standby_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":649,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027standby\u0027)"},{"line_number":650,"context_line":"        l3_active_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":651,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027active\u0027)"},{"line_number":652,"context_line":"        self.assertEqual(1, len(l3_active_agents))"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        # Let\u0027s check first if connectivity from external_vm to router\u0027s"},{"line_number":655,"context_line":"        # external gateway IP is possible before we restart agents"}],"source_content_type":"text/x-python","patch_set":6,"id":"d60157ef_8ef36920","line":652,"range":{"start_line":648,"start_character":0,"end_line":652,"end_character":50},"in_reply_to":"77dde92e_3e3b1f45","updated":"2024-06-18 13:06:21.000000000","message":"I tried to address this in patchset 8 by reusing _get_l3_agents_with_ha_state. Hope that\u0027s what you had in mind.","commit_id":"a6d678d5602f5b894b3f5033d5cdec06e169fc6a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"c14071ff10d5abb11a556d9ddca09fab238cf870","unresolved":false,"context_lines":[{"line_number":645,"context_line":"            \u0027external_fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"        l3_agents \u003d [host.agents[\u0027l3\u0027] for host in self.environment.hosts]"},{"line_number":648,"context_line":"        l3_standby_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":649,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027standby\u0027)"},{"line_number":650,"context_line":"        l3_active_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":651,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027active\u0027)"},{"line_number":652,"context_line":"        self.assertEqual(1, len(l3_active_agents))"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        # Let\u0027s check first if connectivity from external_vm to router\u0027s"},{"line_number":655,"context_line":"        # external gateway IP is possible before we restart agents"}],"source_content_type":"text/x-python","patch_set":6,"id":"77dde92e_3e3b1f45","line":652,"range":{"start_line":648,"start_character":0,"end_line":652,"end_character":50},"in_reply_to":"7ac91619_ea2056d2","updated":"2024-06-06 03:58:17.000000000","message":"Not exactly, these lines are going to check the router state in neutron DB. For instance, if you kill the master node VRRP, fail-over happen, l3-agent-state-change will finally notify neutron-server to update the DB state as well.","commit_id":"a6d678d5602f5b894b3f5033d5cdec06e169fc6a"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"e862f915ed6bf527e861bcedf8d7f533d620474e","unresolved":false,"context_lines":[{"line_number":645,"context_line":"            \u0027external_fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"        l3_agents \u003d [host.agents[\u0027l3\u0027] for host in self.environment.hosts]"},{"line_number":648,"context_line":"        l3_standby_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":649,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027standby\u0027)"},{"line_number":650,"context_line":"        l3_active_agents \u003d self._get_l3_agents_with_ha_state("},{"line_number":651,"context_line":"            l3_agents, router[\u0027id\u0027], \u0027active\u0027)"},{"line_number":652,"context_line":"        self.assertEqual(1, len(l3_active_agents))"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        # Let\u0027s check first if connectivity from external_vm to router\u0027s"},{"line_number":655,"context_line":"        # external gateway IP is possible before we restart agents"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ac91619_ea2056d2","line":652,"range":{"start_line":648,"start_character":0,"end_line":652,"end_character":50},"in_reply_to":"daed90f1_5202f9ab","updated":"2024-06-04 15:45:12.000000000","message":"I think the code starting at line 508 already does this. It\u0027s a bit different because later in the test the host object is used, but as far as I can see it tests the same condition.","commit_id":"a6d678d5602f5b894b3f5033d5cdec06e169fc6a"}]}
