)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"262738fc67b4df854a8864406e99f6212c63d7f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8ed6dc55_648dee75","updated":"2022-01-19 03:19:38.000000000","message":"Looks ok, but I think we are re-inventing stuff that is already in openstacksdk? See inline comment.","commit_id":"9ef758187e5eaa9e02448ff62019880f16e3c758"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"575d6057e28cca1e67b4f05ec3e04597587b2176","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"dbee2e7e_58924c93","updated":"2022-01-24 22:32:01.000000000","message":"Looks good.","commit_id":"1437fd07c930d11e10cd714244b79486f4b97aa3"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"98d190eca51ea9127ba4fc16e60642146a912df5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"daa14f32_08410305","updated":"2022-01-24 16:15:16.000000000","message":"recheck","commit_id":"1437fd07c930d11e10cd714244b79486f4b97aa3"}],"tripleoclient/v1/overcloud_node.py":[{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"89382970a4f153daf11a7db3dced49d12161e71a","unresolved":true,"context_lines":[{"line_number":274,"context_line":"            clean.clean_manageable_nodes()"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        if parsed_args.provide:"},{"line_number":277,"context_line":"            provide \u003d tb.TripleoProvide(verbosity\u003dparsed_args.verbosity)"},{"line_number":278,"context_line":"            if nodes:"},{"line_number":279,"context_line":"                provide.provide(nodes\u003dnodes)"},{"line_number":280,"context_line":"            else:"},{"line_number":281,"context_line":"                provide.provide_manageable_nodes()"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"class ConfigureNode(command.Command):"}],"source_content_type":"text/x-python","patch_set":4,"id":"844da9a9_d768bb17","line":281,"range":{"start_line":277,"start_character":12,"end_line":281,"end_character":50},"updated":"2022-01-06 13:21:13.000000000","message":"These changes should be part of the earlier patch, since it affects the \"provide\" tasks.","commit_id":"f1a77e0d430bcddf3c77673ceffaeda8466ca1bc"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"89382970a4f153daf11a7db3dced49d12161e71a","unresolved":true,"context_lines":[{"line_number":465,"context_line":"            )"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        if parsed_args.provide:"},{"line_number":468,"context_line":"            task \u003d tb.TripleoProvide()"},{"line_number":469,"context_line":"            task.provide(nodes\u003dnodes_uuids)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"cd9be601_553881d1","line":468,"range":{"start_line":468,"start_character":0,"end_line":468,"end_character":1},"updated":"2022-01-06 13:21:13.000000000","message":"ditto (also, don\u0027t you want to rename \"task\" to \"provide\" for the sake of consistency?)","commit_id":"f1a77e0d430bcddf3c77673ceffaeda8466ca1bc"}],"tripleoclient/v2/overcloud_node.py":[{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"89382970a4f153daf11a7db3dced49d12161e71a","unresolved":true,"context_lines":[{"line_number":183,"context_line":"                                   \u0027retries\u0027))"},{"line_number":184,"context_line":"        parser.add_argument(\u0027--verbosity\u0027, type\u003dint,"},{"line_number":185,"context_line":"                            default\u003d1,"},{"line_number":186,"context_line":"                            help\u003d_(\u0027Print debug logs during execution\u0027))        "},{"line_number":187,"context_line":"        return parser"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9bd10152_936360d8","side":"PARENT","line":186,"range":{"start_line":186,"start_character":69,"end_line":186,"end_character":80},"updated":"2022-01-06 13:21:13.000000000","message":"This should also be part of the \"provide\" patch imho.","commit_id":"f4d54c6d350790cd4520ef1167e6de13e70b0a21"}],"tripleoclient/workflows/tripleo_baremetal.py":[{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"89382970a4f153daf11a7db3dced49d12161e71a","unresolved":true,"context_lines":[{"line_number":22,"context_line":"from tripleoclient import exceptions as ooo_exceptions"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TripleoBaremetal(object):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    \"\"\"Base class for TripleO Baremetal operations."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"f1e5abfd_616760c3","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"updated":"2022-01-06 13:21:13.000000000","message":"ditto - earlier patch should have that one.","commit_id":"f1a77e0d430bcddf3c77673ceffaeda8466ca1bc"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"262738fc67b4df854a8864406e99f6212c63d7f9","unresolved":true,"context_lines":[{"line_number":257,"context_line":"                timeout\u003dnode_timeout,"},{"line_number":258,"context_line":"                return_when\u003dfutures.ALL_COMPLETED"},{"line_number":259,"context_line":"            )"},{"line_number":260,"context_line":"        nodes_wait \u003d list()"},{"line_number":261,"context_line":"        for job in done:"},{"line_number":262,"context_line":"            if job._exception:"},{"line_number":263,"context_line":"                self.log.error(\"Cleaning failed for node: %s\", job)"},{"line_number":264,"context_line":"            else:"},{"line_number":265,"context_line":"                nodes_wait.append(future_to_build[job])"},{"line_number":266,"context_line":"        else:"},{"line_number":267,"context_line":"            if not_done:"},{"line_number":268,"context_line":"                for job in not_done:"},{"line_number":269,"context_line":"                    self.log.error(\"Cleaning incomplete for node: %s\", job)"},{"line_number":270,"context_line":"        nodes_to_delete \u003d []"},{"line_number":271,"context_line":"        for node in nodes_wait:"},{"line_number":272,"context_line":"            node_info \u003d client.get_node("},{"line_number":273,"context_line":"                node,"},{"line_number":274,"context_line":"                fields\u003d[\u0027provision_state\u0027, \u0027last_error\u0027]"},{"line_number":275,"context_line":"            )"},{"line_number":276,"context_line":"            state \u003d node_info.provision_state"},{"line_number":277,"context_line":"            if state \u003d\u003d \u0027manageable\u0027:"},{"line_number":278,"context_line":"                nodes_to_delete.append(node)"},{"line_number":279,"context_line":"                success_nodes.append(node)"},{"line_number":280,"context_line":"                self.log.info(\u0027Successful cleaning for node %s\u0027, job)"},{"line_number":281,"context_line":"            elif state not in ["},{"line_number":282,"context_line":"                    \u0027manageable\u0027, \u0027cleaning\u0027, \u0027clean wait\u0027, \u0027available\u0027]:"},{"line_number":283,"context_line":"                failed_nodes.append(node)"},{"line_number":284,"context_line":"                nodes_to_delete.append(node)"},{"line_number":285,"context_line":"                self.log.error("},{"line_number":286,"context_line":"                    \u0027Failed cleaning for node %s: %s\u0027,"},{"line_number":287,"context_line":"                    node,"},{"line_number":288,"context_line":"                    (node_info[\u0027last_error\u0027] or \u0027state %s\u0027, state)"},{"line_number":289,"context_line":"                    )"},{"line_number":290,"context_line":"        for node in nodes_to_delete:"},{"line_number":291,"context_line":"            nodes_wait.remove(node)"},{"line_number":292,"context_line":"        if nodes_wait:"},{"line_number":293,"context_line":"            for node in nodes_wait:"},{"line_number":294,"context_line":"                node_info \u003d client.get_node("},{"line_number":295,"context_line":"                    node,"},{"line_number":296,"context_line":"                    fields\u003d[\u0027provision_state\u0027, \u0027last_error\u0027]"},{"line_number":297,"context_line":"                ).to_dict()"},{"line_number":298,"context_line":"                state \u003d node_info[\u0027provision_state\u0027]"},{"line_number":299,"context_line":"                failed_nodes.append(node)"},{"line_number":300,"context_line":"                self.log.error(\u0027Timeout exceeded for node %s: \u0027"},{"line_number":301,"context_line":"                               \u0027node is in state %s\u0027, node, state)"},{"line_number":302,"context_line":"        return(set(failed_nodes), set(success_nodes))"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def clean_manageable_nodes(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f077dba_0aa17b84","line":301,"range":{"start_line":260,"start_character":0,"end_line":301,"end_character":66},"updated":"2022-01-19 03:19:38.000000000","message":"Can we replace a lot of this by using wait_for_nodes_provision_state()\n\n  wait_for_nodes_provision_state(nodes, expected_state, timeout\u003dNone, abort_on_failed_state\u003dTrue, fail\u003dTrue)\n\n    Wait for the nodes to reach the expected state.\n\nSee: https://docs.openstack.org/openstacksdk/latest/user/proxies/baremetal.html\n\nSet it up to return a WaitResult[1], and inspect that?\nhttps://docs.openstack.org/openstacksdk/latest/user/resources/baremetal/v1/node.html#openstack.baremetal.v1.node.WaitResult","commit_id":"9ef758187e5eaa9e02448ff62019880f16e3c758"},{"author":{"_account_id":30073,"name":"Brendan Shephard","email":"bshephar@bne-home.net","username":"bshephar"},"change_message_id":"d9f3a85157b869e0ee5aecc1fcd2dc78cb15ec0c","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                timeout\u003dnode_timeout,"},{"line_number":258,"context_line":"                return_when\u003dfutures.ALL_COMPLETED"},{"line_number":259,"context_line":"            )"},{"line_number":260,"context_line":"        nodes_wait \u003d list()"},{"line_number":261,"context_line":"        for job in done:"},{"line_number":262,"context_line":"            if job._exception:"},{"line_number":263,"context_line":"                self.log.error(\"Cleaning failed for node: %s\", job)"},{"line_number":264,"context_line":"            else:"},{"line_number":265,"context_line":"                nodes_wait.append(future_to_build[job])"},{"line_number":266,"context_line":"        else:"},{"line_number":267,"context_line":"            if not_done:"},{"line_number":268,"context_line":"                for job in not_done:"},{"line_number":269,"context_line":"                    self.log.error(\"Cleaning incomplete for node: %s\", job)"},{"line_number":270,"context_line":"        nodes_to_delete \u003d []"},{"line_number":271,"context_line":"        for node in nodes_wait:"},{"line_number":272,"context_line":"            node_info \u003d client.get_node("},{"line_number":273,"context_line":"                node,"},{"line_number":274,"context_line":"                fields\u003d[\u0027provision_state\u0027, \u0027last_error\u0027]"},{"line_number":275,"context_line":"            )"},{"line_number":276,"context_line":"            state \u003d node_info.provision_state"},{"line_number":277,"context_line":"            if state \u003d\u003d \u0027manageable\u0027:"},{"line_number":278,"context_line":"                nodes_to_delete.append(node)"},{"line_number":279,"context_line":"                success_nodes.append(node)"},{"line_number":280,"context_line":"                self.log.info(\u0027Successful cleaning for node %s\u0027, job)"},{"line_number":281,"context_line":"            elif state not in ["},{"line_number":282,"context_line":"                    \u0027manageable\u0027, \u0027cleaning\u0027, \u0027clean wait\u0027, \u0027available\u0027]:"},{"line_number":283,"context_line":"                failed_nodes.append(node)"},{"line_number":284,"context_line":"                nodes_to_delete.append(node)"},{"line_number":285,"context_line":"                self.log.error("},{"line_number":286,"context_line":"                    \u0027Failed cleaning for node %s: %s\u0027,"},{"line_number":287,"context_line":"                    node,"},{"line_number":288,"context_line":"                    (node_info[\u0027last_error\u0027] or \u0027state %s\u0027, state)"},{"line_number":289,"context_line":"                    )"},{"line_number":290,"context_line":"        for node in nodes_to_delete:"},{"line_number":291,"context_line":"            nodes_wait.remove(node)"},{"line_number":292,"context_line":"        if nodes_wait:"},{"line_number":293,"context_line":"            for node in nodes_wait:"},{"line_number":294,"context_line":"                node_info \u003d client.get_node("},{"line_number":295,"context_line":"                    node,"},{"line_number":296,"context_line":"                    fields\u003d[\u0027provision_state\u0027, \u0027last_error\u0027]"},{"line_number":297,"context_line":"                ).to_dict()"},{"line_number":298,"context_line":"                state \u003d node_info[\u0027provision_state\u0027]"},{"line_number":299,"context_line":"                failed_nodes.append(node)"},{"line_number":300,"context_line":"                self.log.error(\u0027Timeout exceeded for node %s: \u0027"},{"line_number":301,"context_line":"                               \u0027node is in state %s\u0027, node, state)"},{"line_number":302,"context_line":"        return(set(failed_nodes), set(success_nodes))"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def clean_manageable_nodes(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf9747ac_b7db59cd","line":301,"range":{"start_line":260,"start_character":0,"end_line":301,"end_character":66},"in_reply_to":"7f077dba_0aa17b84","updated":"2022-01-24 12:01:51.000000000","message":"Ack","commit_id":"9ef758187e5eaa9e02448ff62019880f16e3c758"}]}
