)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2490ba3fc800291393c51d87bf6772749a7c6243","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Addressing L3 HA keepalived failures in functional tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Current testing of Keepalived was not configuring the connectivity"},{"line_number":10,"context_line":"between 2 agent namespaces. Also, the external bridge gq-\u003cid\u003e was not"},{"line_number":11,"context_line":"moved from master router to slave namespace."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I82b3218091da4feb39a9e820d0e54639ae27c97d"},{"line_number":14,"context_line":"Closes-Bug: #1580648"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7a3c09a3_071fc55f","line":11,"range":{"start_line":9,"start_character":0,"end_line":11,"end_character":44},"updated":"2017-01-16 12:40:26.000000000","message":"The problem I\u0027m seeing is that in functional tests, the 2 agents configured in 2 namespaces were not connected by veth pair, because veth-pair were not set to UP state.\n\nAnother issue I\u0027m still facing is that after first router is up, it has all devices in its namespace. But when the second router is started, the qg-\u003cid\u003e and qr-\u003cid\u003e devices are moved into second agent namespace, so router1 does not have it anymore.\n\nThe result is that router1 has ha_state set to master, but does not have the qg and qr deviced in its namespace. I\u0027m still working on solving it, some logs:\nhttp://paste.openstack.org/show/595031/","commit_id":"beceb4c4d253dcfe3630bfafcd7952096b27d00c"}],"neutron/tests/functional/agent/l3/framework.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"a9c924cadfa94ad2ca9240447cd256cc1df6c98d","unresolved":false,"context_lines":[{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        get_ext_name \u003d mock.patch.object(l3_router_info.RouterInfo,"},{"line_number":522,"context_line":"            \u0027get_external_device_name\u0027).start()"},{"line_number":523,"context_line":"        get_ext_name.return_value \u003d \"qg-router1\""},{"line_number":524,"context_line":"        get_int_name \u003d mock.patch.object(l3_router_info.RouterInfo,"},{"line_number":525,"context_line":"            \u0027get_internal_device_name\u0027).start()"},{"line_number":526,"context_line":"        get_int_name.return_value \u003d \"qr-router1\""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_3a50e80a","line":523,"range":{"start_line":523,"start_character":37,"end_line":523,"end_character":47},"updated":"2017-01-18 12:04:09.000000000","message":"This kinda makes it hard-coded that there are\u0027s at most a single ha test (since \u0027qg-router1\u0027 and \u0027qg-router2\u0027 are hard-coded).\n\nWhat if i want to run this on 3 agents?\nWhat if I want to run multiple ha tests concurrently?","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"dcf7d580779f88070d21c99b3ca8b41703475d9b","unresolved":false,"context_lines":[{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        get_ext_name \u003d mock.patch.object(l3_router_info.RouterInfo,"},{"line_number":522,"context_line":"            \u0027get_external_device_name\u0027).start()"},{"line_number":523,"context_line":"        get_ext_name.return_value \u003d \"qg-router1\""},{"line_number":524,"context_line":"        get_int_name \u003d mock.patch.object(l3_router_info.RouterInfo,"},{"line_number":525,"context_line":"            \u0027get_internal_device_name\u0027).start()"},{"line_number":526,"context_line":"        get_int_name.return_value \u003d \"qr-router1\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_a4d801f1","line":523,"range":{"start_line":523,"start_character":37,"end_line":523,"end_character":47},"in_reply_to":"7a3c09a3_3a50e80a","updated":"2017-01-19 12:12:55.000000000","message":"Added generated router name and generalized function to create a router.","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"a9c924cadfa94ad2ca9240447cd256cc1df6c98d","unresolved":false,"context_lines":[{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        router1 \u003d self.manage_router(self.agent, router_info)"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        router_ext_name \u003d mock.patch.object(router1,"},{"line_number":531,"context_line":"            \u0027get_external_device_name\u0027).start()"},{"line_number":532,"context_line":"        router_ext_name.return_value \u003d get_ext_name.return_value"},{"line_number":533,"context_line":"        router_int_name \u003d mock.patch.object(router1,"},{"line_number":534,"context_line":"            \u0027get_internal_device_name\u0027).start()"},{"line_number":535,"context_line":"        router_int_name.return_value \u003d get_int_name.return_value"},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"        self._add_fip(router1, \u0027192.168.111.12\u0027)"},{"line_number":538,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_fab8202c","line":535,"range":{"start_line":530,"start_character":8,"end_line":535,"end_character":64},"updated":"2017-01-18 12:04:09.000000000","message":"Mostly code-duplication from lines 521-528. This can be generalized into being a generic, re-usable function.","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"dcf7d580779f88070d21c99b3ca8b41703475d9b","unresolved":false,"context_lines":[{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        router1 \u003d self.manage_router(self.agent, router_info)"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        router_ext_name \u003d mock.patch.object(router1,"},{"line_number":531,"context_line":"            \u0027get_external_device_name\u0027).start()"},{"line_number":532,"context_line":"        router_ext_name.return_value \u003d get_ext_name.return_value"},{"line_number":533,"context_line":"        router_int_name \u003d mock.patch.object(router1,"},{"line_number":534,"context_line":"            \u0027get_internal_device_name\u0027).start()"},{"line_number":535,"context_line":"        router_int_name.return_value \u003d get_int_name.return_value"},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"        self._add_fip(router1, \u0027192.168.111.12\u0027)"},{"line_number":538,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_24f33175","line":535,"range":{"start_line":530,"start_character":8,"end_line":535,"end_character":64},"in_reply_to":"7a3c09a3_fab8202c","updated":"2017-01-19 12:12:55.000000000","message":"Done","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"a9c924cadfa94ad2ca9240447cd256cc1df6c98d","unresolved":false,"context_lines":[{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        router2_ext_name \u003d mock.patch.object(router2,"},{"line_number":558,"context_line":"            \u0027get_external_device_name\u0027).start()"},{"line_number":559,"context_line":"        router2_ext_name.return_value \u003d get_ext_name.return_value"},{"line_number":560,"context_line":"        router2_int_name \u003d mock.patch.object(router2,"},{"line_number":561,"context_line":"            \u0027get_internal_device_name\u0027).start()"},{"line_number":562,"context_line":"        router2_int_name.return_value \u003d get_int_name.return_value"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        r2_br \u003d ip_lib.IPDevice(router2.driver.conf.external_network_bridge)"},{"line_number":565,"context_line":"        r2_br.addr.add(\u002719.4.4.1/24\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_5aef741d","line":562,"range":{"start_line":557,"start_character":8,"end_line":562,"end_character":65},"updated":"2017-01-18 12:04:09.000000000","message":"ditto re: code dup","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"a9c924cadfa94ad2ca9240447cd256cc1df6c98d","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        return (router1, router2)"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    def _get_master_and_slave_routers(self, router1, router2):"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        try:"},{"line_number":573,"context_line":"            common_utils.wait_until_true("},{"line_number":574,"context_line":"                lambda: router1.ha_state \u003d\u003d \u0027master\u0027, timeout\u003d10)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_baea18d9","line":571,"updated":"2017-01-18 12:04:09.000000000","message":"This function can produce false-positives. Imagine the following scenario:\n\n1. agent1 and agent2 both start running as \u0027master\u0027 (for whatever reason - like a network partition because of a misconfiguration, causing both Keepalived to think the other is down),\n2. the check in line 573 returns successfully,\n3. connectivity resumes - both agents think \"hey - lets re-elect!\",\n4. the check in line 575 returns successfully, even though a master wasn\u0027t yet selected.\n\nPerhaps add a third check to make sure the first is still master?","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"dcf7d580779f88070d21c99b3ca8b41703475d9b","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        return (router1, router2)"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    def _get_master_and_slave_routers(self, router1, router2):"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        try:"},{"line_number":573,"context_line":"            common_utils.wait_until_true("},{"line_number":574,"context_line":"                lambda: router1.ha_state \u003d\u003d \u0027master\u0027, timeout\u003d10)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_64a45957","line":571,"in_reply_to":"7a3c09a3_baea18d9","updated":"2017-01-19 12:12:55.000000000","message":"I have added third check before returning master and slave routers.","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"a9c924cadfa94ad2ca9240447cd256cc1df6c98d","unresolved":false,"context_lines":[{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        try:"},{"line_number":573,"context_line":"            common_utils.wait_until_true("},{"line_number":574,"context_line":"                lambda: router1.ha_state \u003d\u003d \u0027master\u0027, timeout\u003d10)"},{"line_number":575,"context_line":"            common_utils.wait_until_true("},{"line_number":576,"context_line":"                lambda: self._check_external_device(router1), timeout\u003d10)"},{"line_number":577,"context_line":"            master_router \u003d router1"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_da70c474","line":574,"range":{"start_line":574,"start_character":54,"end_line":574,"end_character":65},"updated":"2017-01-18 12:04:09.000000000","message":"10 seconds isn\u0027t enough time - during busy gates period (think: right before the third milestone and RC of each cycle) the gate is overloaded and trivial things might take a lot longer. Also, by default the Keepalived takes 2*3\u003d6 seconds to trigger a re-election, so this only gives 4 seconds of overhead which isn\u0027t enough.","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"dcf7d580779f88070d21c99b3ca8b41703475d9b","unresolved":false,"context_lines":[{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        try:"},{"line_number":573,"context_line":"            common_utils.wait_until_true("},{"line_number":574,"context_line":"                lambda: router1.ha_state \u003d\u003d \u0027master\u0027, timeout\u003d10)"},{"line_number":575,"context_line":"            common_utils.wait_until_true("},{"line_number":576,"context_line":"                lambda: self._check_external_device(router1), timeout\u003d10)"},{"line_number":577,"context_line":"            master_router \u003d router1"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_a48641b7","line":574,"range":{"start_line":574,"start_character":54,"end_line":574,"end_character":65},"in_reply_to":"7a3c09a3_da70c474","updated":"2017-01-19 12:12:55.000000000","message":"Ok, removed the timeout, having default 60 sec.","commit_id":"ef0885d72b573c60c70f782ab009bd4062e236af"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"066f69d533806df0dd5dd198362718e1e34265e2","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        external_port \u003d router.get_ex_gw_port()"},{"line_number":213,"context_line":"        return (self.device_exists_with_ips_and_mac("},{"line_number":214,"context_line":"            external_port, router.get_external_device_name,"},{"line_number":215,"context_line":"            router.ns_name))"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _assert_external_device(self, router):"},{"line_number":218,"context_line":"        self.assertTrue(self._check_external_device(router))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a3905b3_488e7079","line":215,"updated":"2017-01-19 21:17:10.000000000","message":"nit: shouldn\u0027t need the extra ()","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"116cab96773a346c0dc6d72f6f0f56f35b15492c","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        external_port \u003d router.get_ex_gw_port()"},{"line_number":213,"context_line":"        return (self.device_exists_with_ips_and_mac("},{"line_number":214,"context_line":"            external_port, router.get_external_device_name,"},{"line_number":215,"context_line":"            router.ns_name))"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _assert_external_device(self, router):"},{"line_number":218,"context_line":"        self.assertTrue(self._check_external_device(router))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_3d18821d","line":215,"in_reply_to":"5a3905b3_488e7079","updated":"2017-01-26 14:30:19.000000000","message":"nevermind on this one, they are required","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"21e98fe69ee267262a508dd9a327a7d66d728fc6","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        get_ns_name \u003d mock.patch.object("},{"line_number":523,"context_line":"            namespaces.RouterNamespace, \u0027_get_ns_name\u0027).start()"},{"line_number":524,"context_line":"        get_ns_name.return_value \u003d ns_name"},{"line_number":525,"context_line":"        get_ext_name \u003d mock.patch.object(l3_router_info.RouterInfo,"},{"line_number":526,"context_line":"            \u0027get_external_device_name\u0027).start()"},{"line_number":527,"context_line":"        get_ext_name.return_value \u003d ext_name"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_71887c23","line":524,"range":{"start_line":524,"start_character":20,"end_line":524,"end_character":42},"updated":"2017-01-26 12:23:04.000000000","message":"You can pass it directly to the patch.object() function.","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"21e98fe69ee267262a508dd9a327a7d66d728fc6","unresolved":false,"context_lines":[{"line_number":565,"context_line":""},{"line_number":566,"context_line":"        try:"},{"line_number":567,"context_line":"            common_utils.wait_until_true("},{"line_number":568,"context_line":"                lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":569,"context_line":"            common_utils.wait_until_true("},{"line_number":570,"context_line":"                lambda: self._check_external_device(router1))"},{"line_number":571,"context_line":"            master_router \u003d router1"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_31e6f4b4","line":568,"range":{"start_line":568,"start_character":44,"end_line":568,"end_character":52},"updated":"2017-01-26 12:23:04.000000000","message":"I would prefer to get a constant for this. I know we don\u0027t have any in the codebase ... those magical strings just frighten me :)","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"22e148c09ca625fc65308c5914d3522ee55a59d0","unresolved":false,"context_lines":[{"line_number":565,"context_line":""},{"line_number":566,"context_line":"        try:"},{"line_number":567,"context_line":"            common_utils.wait_until_true("},{"line_number":568,"context_line":"                lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":569,"context_line":"            common_utils.wait_until_true("},{"line_number":570,"context_line":"                lambda: self._check_external_device(router1))"},{"line_number":571,"context_line":"            master_router \u003d router1"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_a5ceedb1","line":568,"range":{"start_line":568,"start_character":44,"end_line":568,"end_character":52},"in_reply_to":"3a461143_31e6f4b4","updated":"2017-01-27 12:08:50.000000000","message":"I agree with you Jakub, but there is no \u0027master\u0027/\u0027backup\u0027 enum in code, even for l3 functionality implementation. Replacing it with ENUM is out of scope for this patch.","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"21e98fe69ee267262a508dd9a327a7d66d728fc6","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            master_router \u003d router2"},{"line_number":579,"context_line":"            slave_router \u003d router1"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        common_utils.wait_until_true("},{"line_number":582,"context_line":"                lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":583,"context_line":"        common_utils.wait_until_true("},{"line_number":584,"context_line":"                lambda: self._check_external_device(master_router))"},{"line_number":585,"context_line":"        return master_router, slave_router"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def fail_ha_router(self, router):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_319434e1","line":584,"range":{"start_line":581,"start_character":0,"end_line":584,"end_character":67},"updated":"2017-01-26 12:23:04.000000000","message":"Whys it here this double check? Isn\u0027t it fine that e.g. if r1 didn\u0027t become master and r2 didn\u0027t raise timeout, that r2 is the master?","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"4c6835259037ab50e9536df25b6ae853da92104b","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            master_router \u003d router2"},{"line_number":579,"context_line":"            slave_router \u003d router1"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        common_utils.wait_until_true("},{"line_number":582,"context_line":"                lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":583,"context_line":"        common_utils.wait_until_true("},{"line_number":584,"context_line":"                lambda: self._check_external_device(master_router))"},{"line_number":585,"context_line":"        return master_router, slave_router"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def fail_ha_router(self, router):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_e42f423c","line":584,"range":{"start_line":581,"start_character":0,"end_line":584,"end_character":67},"in_reply_to":"3a461143_319434e1","updated":"2017-01-26 15:32:53.000000000","message":"It was John\u0027s request on PS2:\nhttps://review.openstack.org/#/c/420693/2/neutron/tests/functional/agent/l3/framework.py@571","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"4c6835259037ab50e9536df25b6ae853da92104b","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            master_router \u003d router2"},{"line_number":579,"context_line":"            slave_router \u003d router1"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        common_utils.wait_until_true("},{"line_number":582,"context_line":"                lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":583,"context_line":"        common_utils.wait_until_true("},{"line_number":584,"context_line":"                lambda: self._check_external_device(master_router))"},{"line_number":585,"context_line":"        return master_router, slave_router"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def fail_ha_router(self, router):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_c437a6ae","line":584,"range":{"start_line":581,"start_character":0,"end_line":584,"end_character":67},"in_reply_to":"3a461143_319434e1","updated":"2017-01-26 15:32:53.000000000","message":"It was John\u0027s request to double check the state:","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"047d9e6dd02b773f7618c171811a599ca0914ceb","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            master_router \u003d router2"},{"line_number":579,"context_line":"            slave_router \u003d router1"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        common_utils.wait_until_true("},{"line_number":582,"context_line":"                lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":583,"context_line":"        common_utils.wait_until_true("},{"line_number":584,"context_line":"                lambda: self._check_external_device(master_router))"},{"line_number":585,"context_line":"        return master_router, slave_router"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def fail_ha_router(self, router):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_ed61e5a9","line":584,"range":{"start_line":581,"start_character":0,"end_line":584,"end_character":67},"in_reply_to":"3a461143_e42f423c","updated":"2017-01-26 16:33:45.000000000","message":"I\u0027m fine with the extra check here, but does the caller need to do it again?  Over in test_ha_router_failover() ?","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"22e148c09ca625fc65308c5914d3522ee55a59d0","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            master_router \u003d router2"},{"line_number":579,"context_line":"            slave_router \u003d router1"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        common_utils.wait_until_true("},{"line_number":582,"context_line":"                lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":583,"context_line":"        common_utils.wait_until_true("},{"line_number":584,"context_line":"                lambda: self._check_external_device(master_router))"},{"line_number":585,"context_line":"        return master_router, slave_router"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def fail_ha_router(self, router):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_65bec5d5","line":584,"range":{"start_line":581,"start_character":0,"end_line":584,"end_character":67},"in_reply_to":"3a461143_ed61e5a9","updated":"2017-01-27 12:08:50.000000000","message":"I have added extra check if slave router is \u0027backup\u0027 and removed from test code the extra check. In this way, get_master_and_slave_routers will validate the input and there will be no need to call it at caller side.","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"}],"neutron/tests/functional/agent/l3/test_ha_router.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"066f69d533806df0dd5dd198362718e1e34265e2","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            router1, router2)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        common_utils.wait_until_true("},{"line_number":330,"context_line":"            lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        common_utils.wait_until_true("},{"line_number":332,"context_line":"            lambda: slave_router.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":333,"context_line":"        self._assert_external_device(master_router)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a3905b3_083d482b","line":330,"updated":"2017-01-19 21:17:10.000000000","message":"This was already done in _get_master_and_slave_routers()","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"22e148c09ca625fc65308c5914d3522ee55a59d0","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            router1, router2)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        common_utils.wait_until_true("},{"line_number":330,"context_line":"            lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        common_utils.wait_until_true("},{"line_number":332,"context_line":"            lambda: slave_router.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":333,"context_line":"        self._assert_external_device(master_router)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_c5a4d9a7","line":330,"in_reply_to":"5a3905b3_083d482b","updated":"2017-01-27 12:08:50.000000000","message":"Agreed. Removed it here.","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"066f69d533806df0dd5dd198362718e1e34265e2","unresolved":false,"context_lines":[{"line_number":330,"context_line":"            lambda: master_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        common_utils.wait_until_true("},{"line_number":332,"context_line":"            lambda: slave_router.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":333,"context_line":"        self._assert_external_device(master_router)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a3905b3_68124cb6","line":333,"updated":"2017-01-19 21:17:10.000000000","message":"So was this","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"047d9e6dd02b773f7618c171811a599ca0914ceb","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            lambda: slave_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":"        common_utils.wait_until_true("},{"line_number":340,"context_line":"            lambda: master_router.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":341,"context_line":"        self._assert_external_device(slave_router)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"class LinuxBridgeL3HATestCase(L3HATestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_0d839105","line":341,"updated":"2017-01-26 16:33:45.000000000","message":"So maybe here you could even call:\n\nnew_master, new_slave \u003d self._get_master_and_slave_routers(slave_router, master_router)\n\nThen assert that the original slave is now the new master?\n\nThat way this code doesn\u0027t do any wait_until_true() anymore, it\u0027s done in the callee.","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"22e148c09ca625fc65308c5914d3522ee55a59d0","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            lambda: slave_router.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":"        common_utils.wait_until_true("},{"line_number":340,"context_line":"            lambda: master_router.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":341,"context_line":"        self._assert_external_device(slave_router)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"class LinuxBridgeL3HATestCase(L3HATestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_85b1f1e3","line":341,"in_reply_to":"3a461143_0d839105","updated":"2017-01-27 12:08:50.000000000","message":"Done","commit_id":"b2d98aa9735e919036ab90f8776c0d85ea6a5a1b"}]}
