)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":29209,"name":"Dhanuka Warusadura","email":"csx@tuta.io","username":"dnuka"},"change_message_id":"3ccc5349c26d9e4f3fc4f7358f5b03478732a510","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Retries and timeout for IPA command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Addes retries and timeout configuration parameters for IPA"},{"line_number":10,"context_line":"commands that can fail in case of network glitches."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I817a07bf38c0ee1dd7e8599cf4d646a22ab7027f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3f79a3b5_ed60bb0e","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":5},"updated":"2018-11-27 10:42:34.000000000","message":"Adds","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"6aa3494d5ba4731224a201143b09f185a6c526f8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Retries and timeout for IPA command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Addes retries and timeout configuration parameters for IPA"},{"line_number":10,"context_line":"commands that can fail in case of network glitches."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I817a07bf38c0ee1dd7e8599cf4d646a22ab7027f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3f79a3b5_f84ab757","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":5},"in_reply_to":"3f79a3b5_ed60bb0e","updated":"2018-11-27 10:51:45.000000000","message":"Done","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"029a22e6b24016e5ac31deff1adabf02e0899c25","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Iury Gregory Melo Ferreira \u003cimelofer@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-11-27 15:18:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Retries and timeout for IPA command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds retries and timeout configuration parameters for IPA"},{"line_number":10,"context_line":"commands that can fail in case of network glitches."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3f79a3b5_d8369102","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":7},"updated":"2018-11-30 10:40:02.000000000","message":"nit: I think the git custom is to out it in the imperative form i.e.\n\nAdd IPA retries and timeout","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"81fbba358f92a00f6ccb21f80de8790fe213018e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Iury Gregory Melo Ferreira \u003cimelofer@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-11-27 15:18:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Retries and timeout for IPA command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds retries and timeout configuration parameters for IPA"},{"line_number":10,"context_line":"commands that can fail in case of network glitches."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3f79a3b5_9b3ed386","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":7},"in_reply_to":"3f79a3b5_d8369102","updated":"2018-11-30 10:48:08.000000000","message":"Sure","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"}],"ironic/conf/agent.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"029a22e6b24016e5ac31deff1adabf02e0899c25","unresolved":false,"context_lines":[{"line_number":109,"context_line":"               default\u003d3,"},{"line_number":110,"context_line":"               help\u003d_(\u0027This is the maximum number of attempts that will be \u0027"},{"line_number":111,"context_line":"                      \u0027done for IPA commands that fails due to network \u0027"},{"line_number":112,"context_line":"                      \u0027problems\u0027)),"},{"line_number":113,"context_line":"]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_9801f90b","line":112,"range":{"start_line":112,"start_character":23,"end_line":112,"end_character":31},"updated":"2018-11-30 10:40:02.000000000","message":"nit: missing dot","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"81fbba358f92a00f6ccb21f80de8790fe213018e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"               default\u003d3,"},{"line_number":110,"context_line":"               help\u003d_(\u0027This is the maximum number of attempts that will be \u0027"},{"line_number":111,"context_line":"                      \u0027done for IPA commands that fails due to network \u0027"},{"line_number":112,"context_line":"                      \u0027problems\u0027)),"},{"line_number":113,"context_line":"]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_3b4bff29","line":112,"range":{"start_line":112,"start_character":23,"end_line":112,"end_character":31},"in_reply_to":"3f79a3b5_9801f90b","updated":"2018-11-30 10:48:08.000000000","message":"ack","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"}],"ironic/drivers/modules/agent_client.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a9407581e120409b576b82abc1e17345d597d7ce","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        })"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @retrying.retry("},{"line_number":59,"context_line":"        retry_on_exception\u003dlambda e: isinstance(e, requests.ConnectionError),"},{"line_number":60,"context_line":"        stop_max_attempt_number\u003dCONF.agent.command_retries)"},{"line_number":61,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":62,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_c0836805","line":59,"updated":"2018-11-24 18:56:46.000000000","message":"Should be AgentConnectionFailed - see below","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"05792d0d7a5759ec95db24868db6db987f8a17e2","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        })"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @retrying.retry("},{"line_number":59,"context_line":"        retry_on_exception\u003dlambda e: isinstance(e, requests.ConnectionError),"},{"line_number":60,"context_line":"        stop_max_attempt_number\u003dCONF.agent.command_retries)"},{"line_number":61,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":62,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_c45e15e7","line":59,"in_reply_to":"3f79a3b5_c0836805","updated":"2018-11-26 08:46:40.000000000","message":"Got it!","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a9407581e120409b576b82abc1e17345d597d7ce","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @retrying.retry("},{"line_number":59,"context_line":"        retry_on_exception\u003dlambda e: isinstance(e, requests.ConnectionError),"},{"line_number":60,"context_line":"        stop_max_attempt_number\u003dCONF.agent.command_retries)"},{"line_number":61,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":62,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"},{"line_number":63,"context_line":"        \"\"\"Sends command to agent."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_e088e421","line":60,"updated":"2018-11-24 18:56:46.000000000","message":"I think we should swap this with timer(), otherwise timer will time each attempt separately","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"67cc2a7adb541ede5b40b1831e866a9b70002d7c","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @retrying.retry("},{"line_number":59,"context_line":"        retry_on_exception\u003dlambda e: isinstance(e, requests.ConnectionError),"},{"line_number":60,"context_line":"        stop_max_attempt_number\u003dCONF.agent.command_retries)"},{"line_number":61,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":62,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"},{"line_number":63,"context_line":"        \"\"\"Sends command to agent."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_b729c9f1","line":60,"in_reply_to":"3f79a3b5_3718591d","updated":"2018-11-26 09:03:11.000000000","message":"Nevermind, is just swap the order of the decorators right?","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"05792d0d7a5759ec95db24868db6db987f8a17e2","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @retrying.retry("},{"line_number":59,"context_line":"        retry_on_exception\u003dlambda e: isinstance(e, requests.ConnectionError),"},{"line_number":60,"context_line":"        stop_max_attempt_number\u003dCONF.agent.command_retries)"},{"line_number":61,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":62,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"},{"line_number":63,"context_line":"        \"\"\"Sends command to agent."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_3718591d","line":60,"in_reply_to":"3f79a3b5_e088e421","updated":"2018-11-26 08:46:40.000000000","message":"The decorator is set to stop after reach the number of retries and will only do if the exception occurs(will update the exception), so why swap `stop_max_attempt_number`?\n\nNot sure if I fully understood what the timer() would be too,\n\n1- the timer() would be  @METRICS.timer?\n2- swap the decorator and handle the retries and timeout with time from python?","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a9407581e120409b576b82abc1e17345d597d7ce","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                     \u0027for invoking command %(method)s. Error: %(error)s\u0027) %"},{"line_number":92,"context_line":"                   {\u0027node\u0027: node.uuid, \u0027method\u0027: method, \u0027error\u0027: e})"},{"line_number":93,"context_line":"            LOG.error(msg)"},{"line_number":94,"context_line":"            raise exception.AgentConnectionFailed(reason\u003dmsg)"},{"line_number":95,"context_line":"        except requests.RequestException as e:"},{"line_number":96,"context_line":"            msg \u003d (_(\u0027Error invoking agent command %(method)s for node \u0027"},{"line_number":97,"context_line":"                     \u0027%(node)s. Error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_8079f032","line":94,"updated":"2018-11-24 18:56:46.000000000","message":"you need to catch this exception, as ConnectionError is silenced here","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"05792d0d7a5759ec95db24868db6db987f8a17e2","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                     \u0027for invoking command %(method)s. Error: %(error)s\u0027) %"},{"line_number":92,"context_line":"                   {\u0027node\u0027: node.uuid, \u0027method\u0027: method, \u0027error\u0027: e})"},{"line_number":93,"context_line":"            LOG.error(msg)"},{"line_number":94,"context_line":"            raise exception.AgentConnectionFailed(reason\u003dmsg)"},{"line_number":95,"context_line":"        except requests.RequestException as e:"},{"line_number":96,"context_line":"            msg \u003d (_(\u0027Error invoking agent command %(method)s for node \u0027"},{"line_number":97,"context_line":"                     \u0027%(node)s. Error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_f70d01db","line":94,"in_reply_to":"3f79a3b5_8079f032","updated":"2018-11-26 08:46:40.000000000","message":"Thanks","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"029a22e6b24016e5ac31deff1adabf02e0899c25","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":59,"context_line":"    @retrying.retry("},{"line_number":60,"context_line":"        retry_on_exception\u003d("},{"line_number":61,"context_line":"            lambda e: isinstance(e, exception.AgentConnectionFailed)),"},{"line_number":62,"context_line":"        stop_max_attempt_number\u003dCONF.agent.max_command_attempts)"},{"line_number":63,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"},{"line_number":64,"context_line":"        \"\"\"Sends command to agent."}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_fbc827ab","line":61,"range":{"start_line":61,"start_character":46,"end_line":61,"end_character":67},"updated":"2018-11-30 10:40:02.000000000","message":"How does `retry` work when it gives up? Will it reraise this exception or raise its own? Either way, should we document that other exception if it actually bubbles up?","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"6f44f295a2743e9f55ef46397512f8818bae1432","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":59,"context_line":"    @retrying.retry("},{"line_number":60,"context_line":"        retry_on_exception\u003d("},{"line_number":61,"context_line":"            lambda e: isinstance(e, exception.AgentConnectionFailed)),"},{"line_number":62,"context_line":"        stop_max_attempt_number\u003dCONF.agent.max_command_attempts)"},{"line_number":63,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"},{"line_number":64,"context_line":"        \"\"\"Sends command to agent."}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_5bcefb58","line":61,"range":{"start_line":61,"start_character":46,"end_line":61,"end_character":67},"in_reply_to":"3f79a3b5_7b18971f","updated":"2018-11-30 10:57:42.000000000","message":"nit: So it will reraise `AgentConnectoinFailed`, right? It seems to subclass `IronicException` which is documented in the docstring. But does not mention that it is raised on timeout in particular.","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"81fbba358f92a00f6ccb21f80de8790fe213018e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    @METRICS.timer(\u0027AgentClient._command\u0027)"},{"line_number":59,"context_line":"    @retrying.retry("},{"line_number":60,"context_line":"        retry_on_exception\u003d("},{"line_number":61,"context_line":"            lambda e: isinstance(e, exception.AgentConnectionFailed)),"},{"line_number":62,"context_line":"        stop_max_attempt_number\u003dCONF.agent.max_command_attempts)"},{"line_number":63,"context_line":"    def _command(self, node, method, params, wait\u003dFalse):"},{"line_number":64,"context_line":"        \"\"\"Sends command to agent."}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_7b18971f","line":61,"range":{"start_line":61,"start_character":46,"end_line":61,"end_character":67},"in_reply_to":"3f79a3b5_fbc827ab","updated":"2018-11-30 10:48:08.000000000","message":"The last attempt is executed and any error that occurs is the one we have in the workflow for the _command function, so it can raise any exception we have or work.","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"029a22e6b24016e5ac31deff1adabf02e0899c25","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        try:"},{"line_number":88,"context_line":"            response \u003d self.session.post(url, params\u003drequest_params, data\u003dbody,"},{"line_number":89,"context_line":"                                         timeout\u003dCONF.agent.command_timeout)"},{"line_number":90,"context_line":"        except (requests.ConnectionError, requests.Timeout) as e:"},{"line_number":91,"context_line":"            msg \u003d (_(\u0027Failed to connect to the agent running on node %(node)s \u0027"},{"line_number":92,"context_line":"                     \u0027for invoking command %(method)s. Error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_7bbc1708","line":89,"range":{"start_line":89,"start_character":60,"end_line":89,"end_character":75},"updated":"2018-11-30 10:40:02.000000000","message":"nit: does this change the previous timeout value? If it does, should we document that?","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"81fbba358f92a00f6ccb21f80de8790fe213018e","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        try:"},{"line_number":88,"context_line":"            response \u003d self.session.post(url, params\u003drequest_params, data\u003dbody,"},{"line_number":89,"context_line":"                                         timeout\u003dCONF.agent.command_timeout)"},{"line_number":90,"context_line":"        except (requests.ConnectionError, requests.Timeout) as e:"},{"line_number":91,"context_line":"            msg \u003d (_(\u0027Failed to connect to the agent running on node %(node)s \u0027"},{"line_number":92,"context_line":"                     \u0027for invoking command %(method)s. Error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_db552bc3","line":89,"range":{"start_line":89,"start_character":60,"end_line":89,"end_character":75},"in_reply_to":"3f79a3b5_7bbc1708","updated":"2018-11-30 10:48:08.000000000","message":"Well, before we didn\u0027t have the timeout option here so would be the default from requests I think? Yeah, it makes sense document that, will look where I should add this information.","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"}],"ironic/tests/unit/drivers/modules/test_agent_client.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a9407581e120409b576b82abc1e17345d597d7ce","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            data\u003dbody,"},{"line_number":173,"context_line":"            params\u003d{\u0027wait\u0027: \u0027false\u0027},"},{"line_number":174,"context_line":"            timeout\u003d60)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def test_get_commands_status(self):"},{"line_number":177,"context_line":"        with mock.patch.object(self.client.session, \u0027get\u0027,"},{"line_number":178,"context_line":"                               autospec\u003dTrue) as mock_get:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_2091fc50","line":175,"updated":"2018-11-24 18:56:46.000000000","message":"let\u0027s add a unit test for actual retries?","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"05792d0d7a5759ec95db24868db6db987f8a17e2","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            data\u003dbody,"},{"line_number":173,"context_line":"            params\u003d{\u0027wait\u0027: \u0027false\u0027},"},{"line_number":174,"context_line":"            timeout\u003d60)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def test_get_commands_status(self):"},{"line_number":177,"context_line":"        with mock.patch.object(self.client.session, \u0027get\u0027,"},{"line_number":178,"context_line":"                               autospec\u003dTrue) as mock_get:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_97cccd96","line":175,"in_reply_to":"3f79a3b5_2091fc50","updated":"2018-11-26 08:46:40.000000000","message":"Ack","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":29209,"name":"Dhanuka Warusadura","email":"csx@tuta.io","username":"dnuka"},"change_message_id":"3ccc5349c26d9e4f3fc4f7358f5b03478732a510","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                          \u0027error\u0027: error}, str(e))"},{"line_number":177,"context_line":"        self.assertEqual(3, self.client.session.post.call_count)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def test__command_succed_after_two_timeouts(self):"},{"line_number":180,"context_line":"        error \u003d \u0027Connection Timeout\u0027"},{"line_number":181,"context_line":"        response_data \u003d {\u0027status\u0027: \u0027ok\u0027}"},{"line_number":182,"context_line":"        response_text \u003d json.dumps(response_data)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_ed2e7ba8","line":179,"range":{"start_line":179,"start_character":8,"end_line":179,"end_character":47},"updated":"2018-11-27 10:42:34.000000000","message":"`test__command_succeed_after_two_timeouts(self)`","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"6aa3494d5ba4731224a201143b09f185a6c526f8","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                          \u0027error\u0027: error}, str(e))"},{"line_number":177,"context_line":"        self.assertEqual(3, self.client.session.post.call_count)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def test__command_succed_after_two_timeouts(self):"},{"line_number":180,"context_line":"        error \u003d \u0027Connection Timeout\u0027"},{"line_number":181,"context_line":"        response_data \u003d {\u0027status\u0027: \u0027ok\u0027}"},{"line_number":182,"context_line":"        response_text \u003d json.dumps(response_data)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_b8699fbf","line":179,"range":{"start_line":179,"start_character":8,"end_line":179,"end_character":47},"in_reply_to":"3f79a3b5_ed2e7ba8","updated":"2018-11-27 10:51:45.000000000","message":"Done","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"33f5551820baba3c6d9dcff137fef9e64f6e0aa4","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        params \u003d {\u0027image_info\u0027: image_info}"},{"line_number":206,"context_line":"        self.client.session.post.side_effect \u003d [requests.Timeout(error),"},{"line_number":207,"context_line":"                                                MockResponse(response_text),"},{"line_number":208,"context_line":"                                                requests.Timeout(error)]"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        response \u003d self.client._command(self.node, method, params)"},{"line_number":211,"context_line":"        self.assertEqual(2, self.client.session.post.call_count)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_38726fe2","line":208,"updated":"2018-11-27 11:55:25.000000000","message":"do you actually need the timeout after the status ok response ?","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"0fa9bd3784c6a86e283c82c4e70bae67ae650c27","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        params \u003d {\u0027image_info\u0027: image_info}"},{"line_number":206,"context_line":"        self.client.session.post.side_effect \u003d [requests.Timeout(error),"},{"line_number":207,"context_line":"                                                MockResponse(response_text),"},{"line_number":208,"context_line":"                                                requests.Timeout(error)]"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        response \u003d self.client._command(self.node, method, params)"},{"line_number":211,"context_line":"        self.assertEqual(2, self.client.session.post.call_count)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_282c5e47","line":208,"in_reply_to":"3f79a3b5_38726fe2","updated":"2018-11-27 13:26:24.000000000","message":"Is just to test the expected behavior of the retry method,\nlike, show that after a successful request no more retries are done.","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"facd842b39e7b51ded3699146ce90c295823dd24","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                         \u0027command %(method)s. Error: %(error)s\u0027 %"},{"line_number":153,"context_line":"                         {\u0027method\u0027: method, \u0027node\u0027: self.node.uuid,"},{"line_number":154,"context_line":"                          \u0027error\u0027: error}, str(e))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def test__command_fail_all_attempts(self):"},{"line_number":157,"context_line":"        error \u003d \u0027Connection Timeout\u0027"},{"line_number":158,"context_line":"        method \u003d \u0027standby.run_image\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_5249ffb6","line":155,"updated":"2018-11-30 09:32:49.000000000","message":"I wonder if we should mock time.sleep to avoid tests taking too long..","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"81fbba358f92a00f6ccb21f80de8790fe213018e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                         \u0027command %(method)s. Error: %(error)s\u0027 %"},{"line_number":153,"context_line":"                         {\u0027method\u0027: method, \u0027node\u0027: self.node.uuid,"},{"line_number":154,"context_line":"                          \u0027error\u0027: error}, str(e))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def test__command_fail_all_attempts(self):"},{"line_number":157,"context_line":"        error \u003d \u0027Connection Timeout\u0027"},{"line_number":158,"context_line":"        method \u003d \u0027standby.run_image\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_bbd38f36","line":155,"in_reply_to":"3f79a3b5_1bfba314","updated":"2018-11-30 10:48:08.000000000","message":"Ack I will update the tests I\u0027ve changed with this \u003d)","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"029a22e6b24016e5ac31deff1adabf02e0899c25","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                         \u0027command %(method)s. Error: %(error)s\u0027 %"},{"line_number":153,"context_line":"                         {\u0027method\u0027: method, \u0027node\u0027: self.node.uuid,"},{"line_number":154,"context_line":"                          \u0027error\u0027: error}, str(e))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def test__command_fail_all_attempts(self):"},{"line_number":157,"context_line":"        error \u003d \u0027Connection Timeout\u0027"},{"line_number":158,"context_line":"        method \u003d \u0027standby.run_image\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_1bfba314","line":155,"in_reply_to":"3f79a3b5_5249ffb6","updated":"2018-11-30 10:40:02.000000000","message":"++\nI think I\u0027ve spotted a few at other places that slow down tests noticeably","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"bab572b9031f5b08e78ef9fe25a64dd4952545d8","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                         \u0027command %(method)s. Error: %(error)s\u0027 %"},{"line_number":153,"context_line":"                         {\u0027method\u0027: method, \u0027node\u0027: self.node.uuid,"},{"line_number":154,"context_line":"                          \u0027error\u0027: error}, str(e))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def test__command_fail_all_attempts(self):"},{"line_number":157,"context_line":"        error \u003d \u0027Connection Timeout\u0027"},{"line_number":158,"context_line":"        method \u003d \u0027standby.run_image\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_87d3d464","line":155,"in_reply_to":"3f79a3b5_bbd38f36","updated":"2018-11-30 14:53:55.000000000","message":"Please, please please mock it. :)\n\nI would recommend doing it in a new test scenario class with-in this file just so they are executed in a separate group. Mocking time.sleep can be a little problematic.","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"}],"releasenotes/notes/ipa-command-retries-and-timeout-29b0be3f2c21328c.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a9407581e120409b576b82abc1e17345d597d7ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds ``command_timeout`` and ``command_retries`` configuration options to"},{"line_number":5,"context_line":"    IPA, so when connection errors occurs the command will be executed again."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"3f79a3b5_a07e6c17","line":2,"updated":"2018-11-24 18:56:46.000000000","message":"I\u0027d reword this to be a fix, since it\u0027s mostly a fix.","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"05792d0d7a5759ec95db24868db6db987f8a17e2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds ``command_timeout`` and ``command_retries`` configuration options to"},{"line_number":5,"context_line":"    IPA, so when connection errors occurs the command will be executed again."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"3f79a3b5_b7d1c930","line":2,"in_reply_to":"3f79a3b5_a07e6c17","updated":"2018-11-26 08:46:40.000000000","message":"Sure","commit_id":"c0377fff9c425c9fc59f90e96473ad81fd1715cf"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"33f5551820baba3c6d9dcff137fef9e64f6e0aa4","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds ``command_timeout`` and ``command_retries`` configuration options to"},{"line_number":5,"context_line":"    IPA, so when connection errors occurs the command will be executed again."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3f79a3b5_b808bfd6","line":5,"updated":"2018-11-27 11:55:25.000000000","message":"nit: typo s/occurs/occur","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"0fa9bd3784c6a86e283c82c4e70bae67ae650c27","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds ``command_timeout`` and ``command_retries`` configuration options to"},{"line_number":5,"context_line":"    IPA, so when connection errors occurs the command will be executed again."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3f79a3b5_08cde2b8","line":5,"in_reply_to":"3f79a3b5_b808bfd6","updated":"2018-11-27 13:26:24.000000000","message":"Done","commit_id":"127b122bd784739f94c30c5d030ceff7695a685d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"bab572b9031f5b08e78ef9fe25a64dd4952545d8","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":"    Adds ``command_timeout`` and ``max_command_attempts`` configuration options"},{"line_number":5,"context_line":"    to IPA, so when connection errors occur the command will be executed again."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3f79a3b5_07e0242d","line":4,"range":{"start_line":4,"start_character":9,"end_line":4,"end_character":11},"updated":"2018-11-30 14:53:55.000000000","message":"In follow-up, please put what section of the config file where these options are located. Thanks!","commit_id":"a2cffd8c4a12c2967c8424ccc2cca0189a70be75"}]}
