)]}'
{"nova/network/linux_net.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"34ff3c6da94acef28f42e1d64403db0c2980b1f9","unresolved":false,"context_lines":[{"line_number":1600,"context_line":"        if not device_exists(bridge):"},{"line_number":1601,"context_line":"            LOG.debug(\u0027Starting Bridge %s\u0027, bridge)"},{"line_number":1602,"context_line":"            out, err \u003d _execute(\u0027brctl\u0027, \u0027addbr\u0027, bridge,"},{"line_number":1603,"context_line":"                                check_exit_code\u003dFalse, run_as_root\u003dTrue)"},{"line_number":1604,"context_line":"            if (err and err !\u003d \"device %s already exists; can\u0027t create \""},{"line_number":1605,"context_line":"                               \"bridge with the same name\\n\" % (bridge)):"},{"line_number":1606,"context_line":"                msg \u003d _(\u0027Failed to add bridge: %s\u0027) % err"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_7e0f6a88","line":1603,"updated":"2015-07-07 15:13:22.000000000","message":"Instead of grepping for a string in the error text, is it possible to determine if the error was a \"already exists\" error by instead looking at the return code?","commit_id":"4e67c49d31c58c971fa1c9ebf6e333d4340f5ad5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"69f916ea9a2ea1e26cc938ee3f9649c120560f39","unresolved":false,"context_lines":[{"line_number":1600,"context_line":"        if not device_exists(bridge):"},{"line_number":1601,"context_line":"            LOG.debug(\u0027Starting Bridge %s\u0027, bridge)"},{"line_number":1602,"context_line":"            out, err \u003d _execute(\u0027brctl\u0027, \u0027addbr\u0027, bridge,"},{"line_number":1603,"context_line":"                                check_exit_code\u003dFalse, run_as_root\u003dTrue)"},{"line_number":1604,"context_line":"            if (err and err !\u003d \"device %s already exists; can\u0027t create \""},{"line_number":1605,"context_line":"                               \"bridge with the same name\\n\" % (bridge)):"},{"line_number":1606,"context_line":"                msg \u003d _(\u0027Failed to add bridge: %s\u0027) % err"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_5109372b","line":1603,"in_reply_to":"ba3cc151_7e0f6a88","updated":"2015-07-07 15:22:21.000000000","message":"+1, however, the exit code in the bug report is 1 for this error, which is probably generic.  I don\u0027t see anything in the brctl man pages about explicit exit codes.\n\nI found this:\n\nhttp://code.metager.de/source/xref/linux/utils/bridge-utils/brctl/brctl_cmd.c#38\n\nLooks like it handles EEXIST but returns 1 the same as the default in the case statement, so we don\u0027t know if 1 is for this or something, which sucks.","commit_id":"4e67c49d31c58c971fa1c9ebf6e333d4340f5ad5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"34ff3c6da94acef28f42e1d64403db0c2980b1f9","unresolved":false,"context_lines":[{"line_number":1602,"context_line":"            out, err \u003d _execute(\u0027brctl\u0027, \u0027addbr\u0027, bridge,"},{"line_number":1603,"context_line":"                                check_exit_code\u003dFalse, run_as_root\u003dTrue)"},{"line_number":1604,"context_line":"            if (err and err !\u003d \"device %s already exists; can\u0027t create \""},{"line_number":1605,"context_line":"                               \"bridge with the same name\\n\" % (bridge)):"},{"line_number":1606,"context_line":"                msg \u003d _(\u0027Failed to add bridge: %s\u0027) % err"},{"line_number":1607,"context_line":"                raise exception.NovaException(msg)"},{"line_number":1608,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_be2e52f8","line":1605,"updated":"2015-07-07 15:13:22.000000000","message":"nit: no need for parens around (bridge).","commit_id":"4e67c49d31c58c971fa1c9ebf6e333d4340f5ad5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3d89e8a9b64d37e0ea567cee34897220ad033d83","unresolved":false,"context_lines":[{"line_number":1603,"context_line":"                                check_exit_code\u003dFalse, run_as_root\u003dTrue)"},{"line_number":1604,"context_line":"            if (err and err !\u003d \"device %s already exists; can\u0027t create \""},{"line_number":1605,"context_line":"                               \"bridge with the same name\\n\" % (bridge)):"},{"line_number":1606,"context_line":"                msg \u003d _(\u0027Failed to add bridge: %s\u0027) % err"},{"line_number":1607,"context_line":"                raise exception.NovaException(msg)"},{"line_number":1608,"context_line":""},{"line_number":1609,"context_line":"            _execute(\u0027brctl\u0027, \u0027setfd\u0027, bridge, 0, run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_11f96f80","line":1606,"updated":"2015-07-07 15:27:14.000000000","message":"Another thing, for translators, this might be better as:\n\n_(\u0027Failed to add bridge: %(error)s\u0027) % {\u0027error\u0027, err}","commit_id":"4e67c49d31c58c971fa1c9ebf6e333d4340f5ad5"}],"nova/tests/unit/network/test_linux_net.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5e351f5c2beabaa1e6d55d469bb2c4ef34b076ed","unresolved":false,"context_lines":[{"line_number":1164,"context_line":"                              driver.ensure_bridge, \u0027bridge\u0027, \u0027eth0\u0027)"},{"line_number":1165,"context_line":"            device_exists.assert_called_once_with(\u0027bridge\u0027)"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":"    def test_ensure_bridge_brclt_addbr_neutron_race(self):"},{"line_number":1168,"context_line":"        def fake_execute(*cmd, **kwargs):"},{"line_number":1169,"context_line":"            if (\u0027brctl\u0027, \u0027addbr\u0027, \u0027brq1234567-89\u0027) \u003d\u003d cmd:"},{"line_number":1170,"context_line":"                return (\u0027\u0027, \"device brq1234567-89 already exists; \""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_918fbf22","line":1167,"updated":"2015-07-07 15:25:46.000000000","message":"A comment might be useful saying that this is testing the case that device_exists returns False but brctl addbr fails due to the device already existing (because of a race) - we are testing that we don\u0027t fail when we detect the race.","commit_id":"4e67c49d31c58c971fa1c9ebf6e333d4340f5ad5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5e351f5c2beabaa1e6d55d469bb2c4ef34b076ed","unresolved":false,"context_lines":[{"line_number":1172,"context_line":"            else:"},{"line_number":1173,"context_line":"                return (\u0027\u0027, \u0027\u0027)"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"        with contextlib.nested("},{"line_number":1176,"context_line":"            mock.patch.object(linux_net, \u0027device_exists\u0027, return_value\u003dFalse),"},{"line_number":1177,"context_line":"            mock.patch.object(linux_net, \u0027_execute\u0027, fake_execute)"},{"line_number":1178,"context_line":"        ) as (device_exists, _):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_b1a443b9","line":1175,"updated":"2015-07-07 15:25:46.000000000","message":"nit: we could avoid the nested context mocks here if you decorate the method:\n\n@mock.patch.object(linux_net, \u0027device_exists\u0027, return_value\u003dFalse)\n\netc","commit_id":"4e67c49d31c58c971fa1c9ebf6e333d4340f5ad5"}]}
