)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"b7d709bef51194d1eda5f0d5346bfbaa041f9a15","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add --wait flag for provision actions and wait_for_provision_state function"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This changes adds --wait[\u003dtimeout] flag for all provisioning actions but abort."},{"line_number":10,"context_line":"It also adds a helper node method wait_for_provision_state to back this flag."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I8ba5c7da8980e932a578b084167b00e2b20f6daf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"7aa08908_3ee2ced5","line":9,"updated":"2016-06-17 13:23:47.000000000","message":"Nit: \"This change\"","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add --wait flag for provision actions and wait_for_provision_state function"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This changes adds --wait[\u003dtimeout] flag for all provisioning actions but abort."},{"line_number":10,"context_line":"It also adds a helper node method wait_for_provision_state to back this flag."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I8ba5c7da8980e932a578b084167b00e2b20f6daf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_459daf58","line":9,"in_reply_to":"7aa08908_3ee2ced5","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"}],"ironicclient/exc.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class StateTransitionTimeout(ClientException):"},{"line_number":44,"context_line":"    \"\"\"Timeout when waiting for a requested provision state.\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def from_response(response, message\u003dNone, traceback\u003dNone, method\u003dNone,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_03d52fb8","line":44,"updated":"2016-08-09 17:39:02.000000000","message":"how about \u0027Timed out while waiting...\u0027","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class StateTransitionTimeout(ClientException):"},{"line_number":44,"context_line":"    \"\"\"Timeout when waiting for a requested provision state.\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def from_response(response, message\u003dNone, traceback\u003dNone, method\u003dNone,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_0593b750","line":44,"in_reply_to":"9ad45d7e_03d52fb8","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"}],"ironicclient/tests/unit/v1/test_node.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0abe3bd6fd2df10d8c47be591be3cebca905ca7c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3ac371cc_14d8f552","line":1102,"updated":"2016-08-15 16:04:11.000000000","message":"how much testing should we do here? what if timeout is negative value?what if poll_interval is negative value? what if another function is supplied for poll_delay_function? (If a function is provided, we\u0027re ok letting any exceptions be raised?)\n\n[I think I\u0027m fine if you don\u0027t do any of these; just want to make sure you didn\u0027t want to.]","commit_id":"d90fbcbb79ce7f1b5c2bff985419a07c79a51689"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"56f15fec9c72a2af58b75b226b7a63cfd1a148c7","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"        self.assertRaises(ValueError, self.mgr.wait_for_provision_state,"},{"line_number":1124,"context_line":"                          \u0027node\u0027, \u0027actibe\u0027, timeout\u003d-1)"},{"line_number":1125,"context_line":"        self.assertRaises(TypeError, self.mgr.wait_for_provision_state,"},{"line_number":1126,"context_line":"                          \u0027node\u0027, \u0027actibe\u0027, poll_delay_function\u003d{})"}],"source_content_type":"text/x-python","patch_set":9,"id":"3ac371cc_45aa8471","line":1126,"updated":"2016-08-16 14:35:42.000000000","message":"might want to change the above three s/actibe/active/ :)","commit_id":"071fa002e7384836460c0bf980d35a868e5059c3"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c778f2776b9407f2b0b7ea6f9817573500cd7b3a","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"            self, mock_get, mock_sleep):"},{"line_number":1133,"context_line":"        # This simulates aborted deployment"},{"line_number":1134,"context_line":"        mock_get.side_effect \u003d ["},{"line_number":1135,"context_line":"            self._fake_node_for_wait(\u0027deploying\u0027, target\u003d\u0027active\u0027),"},{"line_number":1136,"context_line":"            self._fake_node_for_wait(\u0027available\u0027),"},{"line_number":1137,"context_line":"        ]"},{"line_number":1138,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_78721b7e","line":1135,"range":{"start_line":1135,"start_character":38,"end_line":1135,"end_character":47},"updated":"2016-08-19 14:09:04.000000000","message":"I think it should be deploy wait here (otoh it could change to deploy wait between returning these two so it\u0027s OK)","commit_id":"e7c286ff1dc38f0d881c0048a35c944a95efa7db"}],"ironicclient/v1/node.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        path \u003d \"%s/vendor_passthru/methods\" % node_ident"},{"line_number":357,"context_line":"        return self.get(path).to_dict()"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def wait_for_provision_state(self, node_ident, expected_state,"},{"line_number":360,"context_line":"                                 timeout\u003d0,"},{"line_number":361,"context_line":"                                 poll_interval\u003d_DEFAULT_POLL_INTERVAL,"},{"line_number":362,"context_line":"                                 poll_delay_function\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_d9ff84ff","line":359,"updated":"2016-08-09 17:39:02.000000000","message":"this is being called from node_shell, w/o expected_state being explicitly specified in the call. I wonder if we should set expected_state to some default.","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d8c14c1841a36825ead0a47b1939359963a42f69","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        path \u003d \"%s/vendor_passthru/methods\" % node_ident"},{"line_number":357,"context_line":"        return self.get(path).to_dict()"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def wait_for_provision_state(self, node_ident, expected_state,"},{"line_number":360,"context_line":"                                 timeout\u003d0,"},{"line_number":361,"context_line":"                                 poll_interval\u003d_DEFAULT_POLL_INTERVAL,"},{"line_number":362,"context_line":"                                 poll_delay_function\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3ac371cc_f9b9d42f","line":359,"in_reply_to":"9ad45d7e_62b5497d","updated":"2016-08-15 16:03:52.000000000","message":"Oh. Right, it is mandatory. I was looking at the call in node_shell.py, which doesn\u0027t explicitly put expected_state; it is in the wait_args dictionary. That\u0027s why I assumed it wasn\u0027t mandatory.:\ncc.node.wait_for_provision_state(args.node, timeout\u003dargs.wait_timeout,\n                                         **wait_args)","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        path \u003d \"%s/vendor_passthru/methods\" % node_ident"},{"line_number":357,"context_line":"        return self.get(path).to_dict()"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def wait_for_provision_state(self, node_ident, expected_state,"},{"line_number":360,"context_line":"                                 timeout\u003d0,"},{"line_number":361,"context_line":"                                 poll_interval\u003d_DEFAULT_POLL_INTERVAL,"},{"line_number":362,"context_line":"                                 poll_delay_function\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_62b5497d","line":359,"in_reply_to":"9ad45d7e_d9ff84ff","updated":"2016-08-12 15:23:15.000000000","message":"Sorry, I don\u0027t quite get it. expected_state is mandatory and it definitely gets passed","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        :param node_ident: node UUID or name"},{"line_number":369,"context_line":"        :param expected_state: expected final provision state"},{"line_number":370,"context_line":"        :param timeout: timeout in seconds, disabled if 0"},{"line_number":371,"context_line":"        :param poll_interval: interval in seconds between 2 poll"},{"line_number":372,"context_line":"        :param poll_delay_function: function to use to wait between polls"},{"line_number":373,"context_line":"                                    (defaults to time.sleep)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_f9b368e7","line":370,"updated":"2016-08-09 17:39:02.000000000","message":"By \u0027disabled\u0027, you mean that it won\u0027t time out; it\u0027ll wait until the node gets to that state or an error occurs, right? When I initially read this, I thought \u0027disabled\u0027 meant that it didn\u0027t wait at all, cuz timeout after 0 seconds is do nothing :) (It might just be me though.)","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        :param node_ident: node UUID or name"},{"line_number":369,"context_line":"        :param expected_state: expected final provision state"},{"line_number":370,"context_line":"        :param timeout: timeout in seconds, disabled if 0"},{"line_number":371,"context_line":"        :param poll_interval: interval in seconds between 2 poll"},{"line_number":372,"context_line":"        :param poll_delay_function: function to use to wait between polls"},{"line_number":373,"context_line":"                                    (defaults to time.sleep)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_22ed118f","line":370,"in_reply_to":"9ad45d7e_f9b368e7","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                               else poll_delay_function)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        # TODO(dtantsur): use version negotiation to request API 1.8 and use"},{"line_number":385,"context_line":"        # the \"fields\" argument to reduce amount of data sent."},{"line_number":386,"context_line":"        while not timeout or time.time() \u003c threshold:"},{"line_number":387,"context_line":"            node \u003d self.get(node_ident)"},{"line_number":388,"context_line":"            if node.provision_state \u003d\u003d expected_state:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_9ec5f23d","line":385,"updated":"2016-08-09 17:39:02.000000000","message":"are you planning on doing the TODO as part of this patch, or is this something to be done later when someone feels like it?","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                               else poll_delay_function)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        # TODO(dtantsur): use version negotiation to request API 1.8 and use"},{"line_number":385,"context_line":"        # the \"fields\" argument to reduce amount of data sent."},{"line_number":386,"context_line":"        while not timeout or time.time() \u003c threshold:"},{"line_number":387,"context_line":"            node \u003d self.get(node_ident)"},{"line_number":388,"context_line":"            if node.provision_state \u003d\u003d expected_state:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_82d79dbe","line":385,"in_reply_to":"9ad45d7e_9ec5f23d","updated":"2016-08-12 15:23:15.000000000","message":"Later; we still have to implement version negotiation support, I guess.","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                          {\u0027node\u0027: node_ident, \u0027state\u0027: expected_state})"},{"line_number":391,"context_line":"                return"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"            if node.last_error:"},{"line_number":394,"context_line":"                raise exc.StateTransitionFailed("},{"line_number":395,"context_line":"                    _(\u0027Node %(node)s failed to reach state %(state)s, \u0027"},{"line_number":396,"context_line":"                      \u0027got %(actual)s state instead with error %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_be98b61c","line":393,"updated":"2016-08-09 17:39:02.000000000","message":"My only concern here is what if, while waiting/between polling, the node error\u0027d out and another request was issued to the node that caused .last_error to be cleared out.","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                          {\u0027node\u0027: node_ident, \u0027state\u0027: expected_state})"},{"line_number":391,"context_line":"                return"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"            if node.last_error:"},{"line_number":394,"context_line":"                raise exc.StateTransitionFailed("},{"line_number":395,"context_line":"                    _(\u0027Node %(node)s failed to reach state %(state)s, \u0027"},{"line_number":396,"context_line":"                      \u0027got %(actual)s state instead with error %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_024e0d96","line":393,"in_reply_to":"9ad45d7e_be98b61c","updated":"2016-08-12 15:23:15.000000000","message":"Yeah.. but I don\u0027t know how to solve it without hardcoding the whole state machine in the client (and even in this case it\u0027s not 100% reliable)","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            if node.last_error:"},{"line_number":394,"context_line":"                raise exc.StateTransitionFailed("},{"line_number":395,"context_line":"                    _(\u0027Node %(node)s failed to reach state %(state)s, \u0027"},{"line_number":396,"context_line":"                      \u0027got %(actual)s state instead with error %(error)s\u0027) %"},{"line_number":397,"context_line":"                    {\u0027node\u0027: node_ident, \u0027state\u0027: expected_state,"},{"line_number":398,"context_line":"                     \u0027actual\u0027: node.provision_state, \u0027error\u0027: node.last_error})"},{"line_number":399,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_9e2172fe","line":396,"updated":"2016-08-09 17:39:02.000000000","message":"how about s/got ... instead/It is in state \u003cactual\u003e, and has error: \u003cerror\u003e/","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            if node.last_error:"},{"line_number":394,"context_line":"                raise exc.StateTransitionFailed("},{"line_number":395,"context_line":"                    _(\u0027Node %(node)s failed to reach state %(state)s, \u0027"},{"line_number":396,"context_line":"                      \u0027got %(actual)s state instead with error %(error)s\u0027) %"},{"line_number":397,"context_line":"                    {\u0027node\u0027: node_ident, \u0027state\u0027: expected_state,"},{"line_number":398,"context_line":"                     \u0027actual\u0027: node.provision_state, \u0027error\u0027: node.last_error})"},{"line_number":399,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_052a977e","line":396,"in_reply_to":"9ad45d7e_9e2172fe","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"56f15fec9c72a2af58b75b226b7a63cfd1a148c7","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        :param timeout: timeout in seconds, no timeout if 0"},{"line_number":377,"context_line":"        :param poll_interval: interval in seconds between 2 poll"},{"line_number":378,"context_line":"        :param poll_delay_function: function to use to wait between polls"},{"line_number":379,"context_line":"                                    (defaults to time.sleep)"},{"line_number":380,"context_line":"        :raises: StateTransitionFailed if node reached an error state"},{"line_number":381,"context_line":"        :raises: StateTransitionTimeout on timeout"},{"line_number":382,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"3ac371cc_25978849","line":379,"updated":"2016-08-16 14:35:42.000000000","message":"might want to mention that the function takes one argument -- the amount of time in sec to wait (and it shouldn\u0027t raise any exceptions).","commit_id":"071fa002e7384836460c0bf980d35a868e5059c3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"08486b6d4a2bff08529817e208052913b3fb3344","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                          {\u0027node\u0027: node_ident, \u0027state\u0027: expected_state})"},{"line_number":401,"context_line":"                return"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"            if node.last_error:"},{"line_number":404,"context_line":"                raise exc.StateTransitionFailed("},{"line_number":405,"context_line":"                    _(\u0027Node %(node)s failed to reach state %(state)s. \u0027"},{"line_number":406,"context_line":"                      \u0027It\\\u0027s in state %(actual)s, and has error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ac371cc_64e39f34","line":403,"updated":"2016-08-18 20:15:14.000000000","message":"what do you think about also checking if the node\u0027s provision state is a FAIL state? I think the failure states all have \u0027fail\u0027 or \u0027error\u0027 in node.provision_state. As long as expected_state is not one of these failure states :)","commit_id":"94527af6134106ff5835f55de0efee87f1e6cefe"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4ea316439adc99272ce010b3b3b3d9a82470251e","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                          {\u0027node\u0027: node_ident, \u0027state\u0027: expected_state})"},{"line_number":401,"context_line":"                return"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"            if node.last_error:"},{"line_number":404,"context_line":"                raise exc.StateTransitionFailed("},{"line_number":405,"context_line":"                    _(\u0027Node %(node)s failed to reach state %(state)s. \u0027"},{"line_number":406,"context_line":"                      \u0027It\\\u0027s in state %(actual)s, and has error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_5b263e17","line":403,"in_reply_to":"3ac371cc_64e39f34","updated":"2016-08-19 13:28:33.000000000","message":"Yeah.. and we should probably also check for unexpected stable state.","commit_id":"94527af6134106ff5835f55de0efee87f1e6cefe"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"14419b3ef1e3d431b4e5148549f7f143da7dd58d","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        :param poll_delay_function: function to use to wait between polls"},{"line_number":385,"context_line":"            (defaults to time.sleep). Should take one argument - delay time"},{"line_number":386,"context_line":"            in seconds. Any exceptions raised inside it will abort the wait."},{"line_number":387,"context_line":"        :param fail_on_unexpected_state: whether to fail if the nodes"},{"line_number":388,"context_line":"            reaches a different stable state."},{"line_number":389,"context_line":"        :raises: StateTransitionFailed if node reached an error state"},{"line_number":390,"context_line":"        :raises: StateTransitionTimeout on timeout"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_4b5430fe","line":387,"updated":"2016-08-22 22:15:55.000000000","message":"nit s/nodes/node/","commit_id":"e7c286ff1dc38f0d881c0048a35c944a95efa7db"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"14419b3ef1e3d431b4e5148549f7f143da7dd58d","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                    _(\u0027Node %(node)s failed to reach state %(state)s. \u0027"},{"line_number":416,"context_line":"                      \u0027It\\\u0027s in state %(actual)s, and has error: %(error)s\u0027) %"},{"line_number":417,"context_line":"                    {\u0027node\u0027: node_ident, \u0027state\u0027: expected_state,"},{"line_number":418,"context_line":"                     \u0027actual\u0027: node.provision_state, \u0027error\u0027: node.last_error})"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"            if fail_on_unexpected_state and not node.target_provision_state:"},{"line_number":421,"context_line":"                raise exc.StateTransitionFailed("}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_4bd7104b","line":418,"updated":"2016-08-22 22:15:55.000000000","message":"it is possible here, that node.last_error is empty, but I\u0027m fine with this msg anyway.","commit_id":"e7c286ff1dc38f0d881c0048a35c944a95efa7db"}],"ironicclient/v1/node_shell.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"b7d709bef51194d1eda5f0d5346bfbaa041f9a15","unresolved":false,"context_lines":[{"line_number":473,"context_line":"    metavar\u003d\u0027\u003cprovision-state\u003e\u0027,"},{"line_number":474,"context_line":"    choices\u003d[\u0027active\u0027, \u0027deleted\u0027, \u0027rebuild\u0027, \u0027inspect\u0027, \u0027provide\u0027,"},{"line_number":475,"context_line":"             \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027, \u0027adopt\u0027],"},{"line_number":476,"context_line":"    help\u003d\"Supported states: \u0027active\u0027, \u0027deleted\u0027, \u0027rebuild\u0027, \""},{"line_number":477,"context_line":"         \"\u0027inspect\u0027, \u0027provide\u0027, \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027, \""},{"line_number":478,"context_line":"         \"or \u0027adopt\u0027.\")"},{"line_number":479,"context_line":"@cliutils.arg("}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_d4d8c9f1","side":"PARENT","line":476,"updated":"2016-06-17 13:23:47.000000000","message":"Should we also be generating the help text from list(PROVISION_ACTIONS)?","commit_id":"494f273621b17d6b0d94a84674186133c91348d3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":473,"context_line":"    metavar\u003d\u0027\u003cprovision-state\u003e\u0027,"},{"line_number":474,"context_line":"    choices\u003d[\u0027active\u0027, \u0027deleted\u0027, \u0027rebuild\u0027, \u0027inspect\u0027, \u0027provide\u0027,"},{"line_number":475,"context_line":"             \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027, \u0027adopt\u0027],"},{"line_number":476,"context_line":"    help\u003d\"Supported states: \u0027active\u0027, \u0027deleted\u0027, \u0027rebuild\u0027, \""},{"line_number":477,"context_line":"         \"\u0027inspect\u0027, \u0027provide\u0027, \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027, \""},{"line_number":478,"context_line":"         \"or \u0027adopt\u0027.\")"},{"line_number":479,"context_line":"@cliutils.arg("}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_c5519fda","side":"PARENT","line":476,"in_reply_to":"7aa08908_d4d8c9f1","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"494f273621b17d6b0d94a84674186133c91348d3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from ironicclient.v1 import resource_fields as res_fields"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"_LONG_ACTION_POLL_INTERVAL \u003d 10"},{"line_number":30,"context_line":"_SHORT_ACTION_POLL_INTERVAL \u003d 2"},{"line_number":31,"context_line":"# This dict acts as both list of possible provision actions and arguments for"},{"line_number":32,"context_line":"# wait_for_provision_state invokation."}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_03a36f50","line":29,"updated":"2016-08-09 17:39:02.000000000","message":"these are seconds?","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from ironicclient.v1 import resource_fields as res_fields"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"_LONG_ACTION_POLL_INTERVAL \u003d 10"},{"line_number":30,"context_line":"_SHORT_ACTION_POLL_INTERVAL \u003d 2"},{"line_number":31,"context_line":"# This dict acts as both list of possible provision actions and arguments for"},{"line_number":32,"context_line":"# wait_for_provision_state invokation."}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_254cfb75","line":29,"in_reply_to":"9ad45d7e_03a36f50","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"b7d709bef51194d1eda5f0d5346bfbaa041f9a15","unresolved":false,"context_lines":[{"line_number":29,"context_line":"_LONG_ACTION_POLL_INTERVAL \u003d 10"},{"line_number":30,"context_line":"_SHORT_ACTION_POLL_INTERVAL \u003d 2"},{"line_number":31,"context_line":"# This dict acts as both list of possible provision actions and arguments for"},{"line_number":32,"context_line":"# wait_for_provision_state invokation."},{"line_number":33,"context_line":"PROVISION_ACTIONS \u003d {"},{"line_number":34,"context_line":"    \u0027active\u0027: {\u0027expected_state\u0027: \u0027active\u0027,"},{"line_number":35,"context_line":"               \u0027poll_interval\u0027: _LONG_ACTION_POLL_INTERVAL},"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_34c14d30","line":32,"updated":"2016-06-17 13:23:47.000000000","message":"Typo: \"invocation\"","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":29,"context_line":"_LONG_ACTION_POLL_INTERVAL \u003d 10"},{"line_number":30,"context_line":"_SHORT_ACTION_POLL_INTERVAL \u003d 2"},{"line_number":31,"context_line":"# This dict acts as both list of possible provision actions and arguments for"},{"line_number":32,"context_line":"# wait_for_provision_state invokation."},{"line_number":33,"context_line":"PROVISION_ACTIONS \u003d {"},{"line_number":34,"context_line":"    \u0027active\u0027: {\u0027expected_state\u0027: \u0027active\u0027,"},{"line_number":35,"context_line":"               \u0027poll_interval\u0027: _LONG_ACTION_POLL_INTERVAL},"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_65a43308","line":32,"in_reply_to":"7aa08908_34c14d30","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \u0027manage\u0027: {\u0027expected_state\u0027: \u0027manageable\u0027,"},{"line_number":48,"context_line":"               \u0027poll_interval\u0027: _SHORT_ACTION_POLL_INTERVAL},"},{"line_number":49,"context_line":"    \u0027clean\u0027: {\u0027expected_state\u0027: \u0027manageable\u0027,"},{"line_number":50,"context_line":"              \u0027poll_interval\u0027: _LONG_ACTION_POLL_INTERVAL},"},{"line_number":51,"context_line":"    \u0027adopt\u0027: {\u0027expected_state\u0027: \u0027active\u0027,"},{"line_number":52,"context_line":"              \u0027poll_interval\u0027: _SHORT_ACTION_POLL_INTERVAL},"},{"line_number":53,"context_line":"    \u0027abort\u0027: None,  # no support for --wait in abort"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_e34a9b82","line":50,"updated":"2016-08-09 17:39:02.000000000","message":"makes me wonder if we need a REALLY_LONG_ACTION... but it does depend on what clean steps are being performed...","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \u0027manage\u0027: {\u0027expected_state\u0027: \u0027manageable\u0027,"},{"line_number":48,"context_line":"               \u0027poll_interval\u0027: _SHORT_ACTION_POLL_INTERVAL},"},{"line_number":49,"context_line":"    \u0027clean\u0027: {\u0027expected_state\u0027: \u0027manageable\u0027,"},{"line_number":50,"context_line":"              \u0027poll_interval\u0027: _LONG_ACTION_POLL_INTERVAL},"},{"line_number":51,"context_line":"    \u0027adopt\u0027: {\u0027expected_state\u0027: \u0027active\u0027,"},{"line_number":52,"context_line":"              \u0027poll_interval\u0027: _SHORT_ACTION_POLL_INTERVAL},"},{"line_number":53,"context_line":"    \u0027abort\u0027: None,  # no support for --wait in abort"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_a5958b89","line":50,"in_reply_to":"9ad45d7e_e34a9b82","updated":"2016-08-12 15:23:15.000000000","message":"Yeah :)","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":531,"context_line":"    const\u003d0,"},{"line_number":532,"context_line":"    nargs\u003d\u0027?\u0027,"},{"line_number":533,"context_line":"    help\u003d(\"Wait for a node to reach the expected state. Not supported \""},{"line_number":534,"context_line":"          \"for \u0027abort\u0027. Optionally takes a timeout in seconds.\"))"},{"line_number":535,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":536,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":537,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_79d778ed","line":534,"updated":"2016-08-09 17:39:02.000000000","message":"Maybe mention that it must be a value \u003e\u003d0, if 0 it won\u0027t time out.","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":531,"context_line":"    const\u003d0,"},{"line_number":532,"context_line":"    nargs\u003d\u0027?\u0027,"},{"line_number":533,"context_line":"    help\u003d(\"Wait for a node to reach the expected state. Not supported \""},{"line_number":534,"context_line":"          \"for \u0027abort\u0027. Optionally takes a timeout in seconds.\"))"},{"line_number":535,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":536,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":537,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_65b3930b","line":534,"in_reply_to":"9ad45d7e_79d778ed","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8e7a8e30d7ea4a1706839bffbaaa140c36914b41","unresolved":false,"context_lines":[{"line_number":547,"context_line":"    if args.wait_timeout is not None:"},{"line_number":548,"context_line":"        wait_args \u003d PROVISION_ACTIONS.get(args.provision_state)"},{"line_number":549,"context_line":"        if wait_args is None:"},{"line_number":550,"context_line":"            raise exceptions.CommandError(_(\u0027--wait is not supported with %s\u0027)"},{"line_number":551,"context_line":"                                          % args.provision_state)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    clean_steps \u003d args.clean_steps"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_7ee3de33","line":550,"updated":"2016-08-09 17:39:02.000000000","message":"s/with/for provision state/","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"94678a003d61d0c211d365e4c280fa49858b4612","unresolved":false,"context_lines":[{"line_number":547,"context_line":"    if args.wait_timeout is not None:"},{"line_number":548,"context_line":"        wait_args \u003d PROVISION_ACTIONS.get(args.provision_state)"},{"line_number":549,"context_line":"        if wait_args is None:"},{"line_number":550,"context_line":"            raise exceptions.CommandError(_(\u0027--wait is not supported with %s\u0027)"},{"line_number":551,"context_line":"                                          % args.provision_state)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    clean_steps \u003d args.clean_steps"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_8578472d","line":550,"in_reply_to":"9ad45d7e_7ee3de33","updated":"2016-08-12 15:23:15.000000000","message":"Done","commit_id":"2876aedc2fa12205219139c7a7af427f7ccb2431"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9e1c76dcab32776aa85a7ffdff8efe9166ff3f05","unresolved":false,"context_lines":[{"line_number":506,"context_line":"    nargs\u003d\u0027?\u0027,"},{"line_number":507,"context_line":"    help\u003d(\"Wait for a node to reach the expected state. Not supported \""},{"line_number":508,"context_line":"          \"for \u0027abort\u0027. Optionally takes a timeout in seconds. \""},{"line_number":509,"context_line":"          \"The default value is 0, meaning no timeout.\"))"},{"line_number":510,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":511,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":512,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ac371cc_04a96790","line":509,"updated":"2016-08-17 16:14:29.000000000","message":"May be good to add here that we rely on last_error to determine if the transition has failed or not, otherwise if it is cleared after failure, we may wait infinitely.","commit_id":"94527af6134106ff5835f55de0efee87f1e6cefe"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4ea316439adc99272ce010b3b3b3d9a82470251e","unresolved":false,"context_lines":[{"line_number":506,"context_line":"    nargs\u003d\u0027?\u0027,"},{"line_number":507,"context_line":"    help\u003d(\"Wait for a node to reach the expected state. Not supported \""},{"line_number":508,"context_line":"          \"for \u0027abort\u0027. Optionally takes a timeout in seconds. \""},{"line_number":509,"context_line":"          \"The default value is 0, meaning no timeout.\"))"},{"line_number":510,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":511,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":512,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_1b8326ce","line":509,"in_reply_to":"3ac371cc_04a96790","updated":"2016-08-19 13:28:33.000000000","message":"Done","commit_id":"94527af6134106ff5835f55de0efee87f1e6cefe"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9e1c76dcab32776aa85a7ffdff8efe9166ff3f05","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        wait_args \u003d PROVISION_ACTIONS.get(args.provision_state)"},{"line_number":524,"context_line":"        if wait_args is None:"},{"line_number":525,"context_line":"            raise exceptions.CommandError("},{"line_number":526,"context_line":"                _(\"\u0027--wait is not supported for provision state \u0027%s\u0027\")"},{"line_number":527,"context_line":"                % args.provision_state)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    clean_steps \u003d args.clean_steps"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ac371cc_33af8b2b","line":526,"range":{"start_line":526,"start_character":19,"end_line":526,"end_character":20},"updated":"2016-08-17 16:14:29.000000000","message":"Should be removed :)","commit_id":"94527af6134106ff5835f55de0efee87f1e6cefe"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4ea316439adc99272ce010b3b3b3d9a82470251e","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        wait_args \u003d PROVISION_ACTIONS.get(args.provision_state)"},{"line_number":524,"context_line":"        if wait_args is None:"},{"line_number":525,"context_line":"            raise exceptions.CommandError("},{"line_number":526,"context_line":"                _(\"\u0027--wait is not supported for provision state \u0027%s\u0027\")"},{"line_number":527,"context_line":"                % args.provision_state)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    clean_steps \u003d args.clean_steps"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_fb872ad5","line":526,"range":{"start_line":526,"start_character":19,"end_line":526,"end_character":20},"in_reply_to":"3ac371cc_33af8b2b","updated":"2016-08-19 13:28:33.000000000","message":"Done","commit_id":"94527af6134106ff5835f55de0efee87f1e6cefe"}],"releasenotes/notes/provision-state-wait-e7ff919ce8e13703.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0abe3bd6fd2df10d8c47be591be3cebca905ca7c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add --wait flag to \"node-set-provision-state\" command and the associated"},{"line_number":4,"context_line":"    call \"wait_for_provision_state\" to the Python API. The flag works with all"},{"line_number":5,"context_line":"    provision actions except for \"abort\"."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3ac371cc_3e7992fd","line":4,"updated":"2016-08-15 16:04:11.000000000","message":"nit. s/call/method/ or function.","commit_id":"d90fbcbb79ce7f1b5c2bff985419a07c79a51689"}]}
