)]}'
{"ironic/conductor/utils.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":745,"context_line":"        raise exception.InvalidParameterValue(err)"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"def notify_conductor_resume_operation(task, operation):"},{"line_number":749,"context_line":"    \"\"\"Notify the conductor to resume an operation."},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"    :param task: the task"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_f6da8177","line":748,"range":{"start_line":748,"start_character":44,"end_line":748,"end_character":53},"updated":"2020-03-11 18:07:19.000000000","message":"nit: elsewhere we call this step_type","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":745,"context_line":"        raise exception.InvalidParameterValue(err)"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"def notify_conductor_resume_operation(task, operation):"},{"line_number":749,"context_line":"    \"\"\"Notify the conductor to resume an operation."},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"    :param task: the task"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_3472477e","line":748,"range":{"start_line":748,"start_character":44,"end_line":748,"end_character":53},"in_reply_to":"1fa4df85_f6da8177","updated":"2020-03-12 11:19:06.000000000","message":"yeah, but this call doesn\u0027t directly refer to steps","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"}],"ironic/drivers/modules/agent_base.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    last_command \u003d commands[-1]"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    if last_command[\u0027command_name\u0027] !\u003d \u0027execute_%s_step\u0027 % step_type:"},{"line_number":200,"context_line":"        # catches race condition where execute_clean_step is still"},{"line_number":201,"context_line":"        # processing so the command hasn\u0027t started yet"},{"line_number":202,"context_line":"        LOG.debug(\u0027Expected agent last command to be \"execute_%(type)s_step\" \u0027"},{"line_number":203,"context_line":"                  \u0027for node %(node)s, instead got \"%(command)s\". Waiting \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_16c15d81","line":200,"range":{"start_line":200,"start_character":39,"end_line":200,"end_character":57},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    last_command \u003d commands[-1]"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    if last_command[\u0027command_name\u0027] !\u003d \u0027execute_%s_step\u0027 % step_type:"},{"line_number":200,"context_line":"        # catches race condition where execute_clean_step is still"},{"line_number":201,"context_line":"        # processing so the command hasn\u0027t started yet"},{"line_number":202,"context_line":"        LOG.debug(\u0027Expected agent last command to be \"execute_%(type)s_step\" \u0027"},{"line_number":203,"context_line":"                  \u0027for node %(node)s, instead got \"%(command)s\". Waiting \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_d40893da","line":200,"range":{"start_line":200,"start_character":39,"end_line":200,"end_character":57},"in_reply_to":"1fa4df85_16c15d81","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    current_step \u003d (task.node.clean_step if step_type \u003d\u003d \u0027clean\u0027"},{"line_number":213,"context_line":"                    else task.node.deploy_step)"},{"line_number":214,"context_line":"    if last_command[\u0027command_status\u0027] \u003d\u003d \u0027RUNNING\u0027:"},{"line_number":215,"context_line":"        LOG.debug(\u0027%s step still running for node %(node)s: %(step)s\u0027,"},{"line_number":216,"context_line":"                  {\u0027step\u0027: last_step, \u0027node\u0027: task.node.uuid,"},{"line_number":217,"context_line":"                   \u0027type\u0027: step_type.capitalize()})"},{"line_number":218,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_d64f4532","line":215,"range":{"start_line":215,"start_character":20,"end_line":215,"end_character":21},"updated":"2020-03-11 18:07:19.000000000","message":"%(type)s","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    current_step \u003d (task.node.clean_step if step_type \u003d\u003d \u0027clean\u0027"},{"line_number":213,"context_line":"                    else task.node.deploy_step)"},{"line_number":214,"context_line":"    if last_command[\u0027command_status\u0027] \u003d\u003d \u0027RUNNING\u0027:"},{"line_number":215,"context_line":"        LOG.debug(\u0027%s step still running for node %(node)s: %(step)s\u0027,"},{"line_number":216,"context_line":"                  {\u0027step\u0027: last_step, \u0027node\u0027: task.node.uuid,"},{"line_number":217,"context_line":"                   \u0027type\u0027: step_type.capitalize()})"},{"line_number":218,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_f4002fae","line":215,"range":{"start_line":215,"start_character":20,"end_line":215,"end_character":21},"in_reply_to":"1fa4df85_d64f4532","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        return"},{"line_number":219,"context_line":"    elif (last_command[\u0027command_status\u0027] \u003d\u003d \u0027SUCCEEDED\u0027"},{"line_number":220,"context_line":"          and last_step !\u003d current_step):"},{"line_number":221,"context_line":"        # A previous clean_step was running, the new command has not yet"},{"line_number":222,"context_line":"        # started."},{"line_number":223,"context_line":"        LOG.debug(\u0027%(type)s step not yet started for node %(node)s: %(step)s\u0027,"},{"line_number":224,"context_line":"                  {\u0027step\u0027: last_step, \u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_365819f9","line":221,"range":{"start_line":221,"start_character":21,"end_line":221,"end_character":31},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        return"},{"line_number":219,"context_line":"    elif (last_command[\u0027command_status\u0027] \u003d\u003d \u0027SUCCEEDED\u0027"},{"line_number":220,"context_line":"          and last_step !\u003d current_step):"},{"line_number":221,"context_line":"        # A previous clean_step was running, the new command has not yet"},{"line_number":222,"context_line":"        # started."},{"line_number":223,"context_line":"        LOG.debug(\u0027%(type)s step not yet started for node %(node)s: %(step)s\u0027,"},{"line_number":224,"context_line":"                  {\u0027step\u0027: last_step, \u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_14fe2bae","line":221,"range":{"start_line":221,"start_character":21,"end_line":221,"end_character":31},"in_reply_to":"1fa4df85_365819f9","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"@METRICS.timer(\u0027post_deploy_step_hook\u0027)"},{"line_number":232,"context_line":"def post_deploy_step_hook(interface, step):"},{"line_number":233,"context_line":"    \"\"\"Decorator method for adding a post deploy step hook."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    This is a mechanism for adding a post deploy step hook for a particular"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_9608edd9","line":232,"range":{"start_line":232,"start_character":4,"end_line":232,"end_character":25},"updated":"2020-03-11 18:07:19.000000000","message":"nit: Should we keep paired functions like this next to each other?","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"@METRICS.timer(\u0027post_deploy_step_hook\u0027)"},{"line_number":232,"context_line":"def post_deploy_step_hook(interface, step):"},{"line_number":233,"context_line":"    \"\"\"Decorator method for adding a post deploy step hook."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    This is a mechanism for adding a post deploy step hook for a particular"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_b42cf74a","line":232,"range":{"start_line":232,"start_character":4,"end_line":232,"end_character":25},"in_reply_to":"1fa4df85_9608edd9","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":285,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":286,"context_line":"    :param interface: The interface for which clean steps"},{"line_number":287,"context_line":"        are to be returned. If this is not provided, it returns the"},{"line_number":288,"context_line":"        clean steps for all interfaces."},{"line_number":289,"context_line":"    :param override_priorities: a dictionary with keys being step names and"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_762c514a","line":286,"range":{"start_line":286,"start_character":46,"end_line":286,"end_character":51},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":285,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":286,"context_line":"    :param interface: The interface for which clean steps"},{"line_number":287,"context_line":"        are to be returned. If this is not provided, it returns the"},{"line_number":288,"context_line":"        clean steps for all interfaces."},{"line_number":289,"context_line":"    :param override_priorities: a dictionary with keys being step names and"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_541d830d","line":286,"range":{"start_line":286,"start_character":46,"end_line":286,"end_character":51},"in_reply_to":"1fa4df85_762c514a","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":285,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":286,"context_line":"    :param interface: The interface for which clean steps"},{"line_number":287,"context_line":"        are to be returned. If this is not provided, it returns the"},{"line_number":288,"context_line":"        clean steps for all interfaces."},{"line_number":289,"context_line":"    :param override_priorities: a dictionary with keys being step names and"},{"line_number":290,"context_line":"        values being new priorities for them. If a step isn\u0027t in this"},{"line_number":291,"context_line":"        dictionary, the step\u0027s original priority is used."}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_f61fe106","line":288,"range":{"start_line":288,"start_character":8,"end_line":288,"end_character":13},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":285,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":286,"context_line":"    :param interface: The interface for which clean steps"},{"line_number":287,"context_line":"        are to be returned. If this is not provided, it returns the"},{"line_number":288,"context_line":"        clean steps for all interfaces."},{"line_number":289,"context_line":"    :param override_priorities: a dictionary with keys being step names and"},{"line_number":290,"context_line":"        values being new priorities for them. If a step isn\u0027t in this"},{"line_number":291,"context_line":"        dictionary, the step\u0027s original priority is used."}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_14170bf0","line":288,"range":{"start_line":288,"start_character":8,"end_line":288,"end_character":13},"in_reply_to":"1fa4df85_f61fe106","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":289,"context_line":"    :param override_priorities: a dictionary with keys being step names and"},{"line_number":290,"context_line":"        values being new priorities for them. If a step isn\u0027t in this"},{"line_number":291,"context_line":"        dictionary, the step\u0027s original priority is used."},{"line_number":292,"context_line":"    :returns: A list of clean step dictionaries"},{"line_number":293,"context_line":"    \"\"\""},{"line_number":294,"context_line":"    node \u003d task.node"},{"line_number":295,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_161ddd0e","line":292,"range":{"start_line":292,"start_character":24,"end_line":292,"end_character":29},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":289,"context_line":"    :param override_priorities: a dictionary with keys being step names and"},{"line_number":290,"context_line":"        values being new priorities for them. If a step isn\u0027t in this"},{"line_number":291,"context_line":"        dictionary, the step\u0027s original priority is used."},{"line_number":292,"context_line":"    :returns: A list of clean step dictionaries"},{"line_number":293,"context_line":"    \"\"\""},{"line_number":294,"context_line":"    node \u003d task.node"},{"line_number":295,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_b4d15732","line":292,"range":{"start_line":292,"start_character":24,"end_line":292,"end_character":29},"in_reply_to":"1fa4df85_161ddd0e","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                                              % step_type]"},{"line_number":298,"context_line":"    except KeyError:"},{"line_number":299,"context_line":"        LOG.debug(\u0027%(type)s steps are not yet available for node %(node)s\u0027,"},{"line_number":300,"context_line":"                  {\u0027type\u0027: step_type, \u0027node\u0027: node.uuid})"},{"line_number":301,"context_line":"        return []"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    if interface:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_b6196923","line":300,"range":{"start_line":300,"start_character":27,"end_line":300,"end_character":36},"updated":"2020-03-11 18:07:19.000000000","message":"nit: capitalize?","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                                              % step_type]"},{"line_number":298,"context_line":"    except KeyError:"},{"line_number":299,"context_line":"        LOG.debug(\u0027%(type)s steps are not yet available for node %(node)s\u0027,"},{"line_number":300,"context_line":"                  {\u0027type\u0027: step_type, \u0027node\u0027: node.uuid})"},{"line_number":301,"context_line":"        return []"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    if interface:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_d4d65328","line":300,"range":{"start_line":300,"start_character":27,"end_line":300,"end_character":36},"in_reply_to":"1fa4df85_b6196923","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"def execute_step(task, step, step_type):"},{"line_number":321,"context_line":"    \"\"\"Execute a clean step asynchronously on the agent."},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":324,"context_line":"    :param step: a clean step dictionary to execute"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_96d6ad27","line":321,"range":{"start_line":321,"start_character":17,"end_line":321,"end_character":22},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"def execute_step(task, step, step_type):"},{"line_number":321,"context_line":"    \"\"\"Execute a clean step asynchronously on the agent."},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":324,"context_line":"    :param step: a clean step dictionary to execute"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_74dbdf4e","line":321,"range":{"start_line":321,"start_character":17,"end_line":321,"end_character":22},"in_reply_to":"1fa4df85_96d6ad27","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":321,"context_line":"    \"\"\"Execute a clean step asynchronously on the agent."},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":324,"context_line":"    :param step: a clean step dictionary to execute"},{"line_number":325,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":326,"context_line":"    :raises: NodeCleaningFailure if the agent does not return a command status"},{"line_number":327,"context_line":"    :returns: states.CLEANWAIT to signify the step will be completed async"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_b6ee49eb","line":324,"range":{"start_line":324,"start_character":19,"end_line":324,"end_character":24},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":321,"context_line":"    \"\"\"Execute a clean step asynchronously on the agent."},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":324,"context_line":"    :param step: a clean step dictionary to execute"},{"line_number":325,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":326,"context_line":"    :raises: NodeCleaningFailure if the agent does not return a command status"},{"line_number":327,"context_line":"    :returns: states.CLEANWAIT to signify the step will be completed async"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_94b9bbea","line":324,"range":{"start_line":324,"start_character":19,"end_line":324,"end_character":24},"in_reply_to":"1fa4df85_b6ee49eb","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":324,"context_line":"    :param step: a clean step dictionary to execute"},{"line_number":325,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":326,"context_line":"    :raises: NodeCleaningFailure if the agent does not return a command status"},{"line_number":327,"context_line":"    :returns: states.CLEANWAIT to signify the step will be completed async"},{"line_number":328,"context_line":"    \"\"\""},{"line_number":329,"context_line":"    client \u003d _get_client()"},{"line_number":330,"context_line":"    ports \u003d objects.Port.list_by_node_id("}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_96bf8dcf","line":327,"range":{"start_line":327,"start_character":21,"end_line":327,"end_character":30},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":324,"context_line":"    :param step: a clean step dictionary to execute"},{"line_number":325,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":326,"context_line":"    :raises: NodeCleaningFailure if the agent does not return a command status"},{"line_number":327,"context_line":"    :returns: states.CLEANWAIT to signify the step will be completed async"},{"line_number":328,"context_line":"    \"\"\""},{"line_number":329,"context_line":"    client \u003d _get_client()"},{"line_number":330,"context_line":"    ports \u003d objects.Port.list_by_node_id("}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_d4bf33ce","line":327,"range":{"start_line":327,"start_character":21,"end_line":327,"end_character":30},"in_reply_to":"1fa4df85_96bf8dcf","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"632a93faa7d1c80cd82ae8e7962dbe68fd526bd6","unresolved":false,"context_lines":[{"line_number":629,"context_line":"    def refresh_steps(self, task, step_type):"},{"line_number":630,"context_line":"        \"\"\"Refresh the node\u0027s cached clean/deploy steps from the booted agent."},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"        Gets the node\u0027s clean steps from the booted agent and caches them."},{"line_number":633,"context_line":"        The steps are cached to make get_clean_steps() calls synchronous, and"},{"line_number":634,"context_line":"        should be refreshed as soon as the agent boots to start cleaning or"},{"line_number":635,"context_line":"        if cleaning is restarted because of a cleaning version mismatch."}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_56aef598","line":632,"range":{"start_line":632,"start_character":24,"end_line":632,"end_character":29},"updated":"2020-03-11 18:07:19.000000000","message":"bzzt","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"159fb88f7256ebb859fe20f26b8959d175c0634c","unresolved":false,"context_lines":[{"line_number":629,"context_line":"    def refresh_steps(self, task, step_type):"},{"line_number":630,"context_line":"        \"\"\"Refresh the node\u0027s cached clean/deploy steps from the booted agent."},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"        Gets the node\u0027s clean steps from the booted agent and caches them."},{"line_number":633,"context_line":"        The steps are cached to make get_clean_steps() calls synchronous, and"},{"line_number":634,"context_line":"        should be refreshed as soon as the agent boots to start cleaning or"},{"line_number":635,"context_line":"        if cleaning is restarted because of a cleaning version mismatch."}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_34cec783","line":632,"range":{"start_line":632,"start_character":24,"end_line":632,"end_character":29},"in_reply_to":"1fa4df85_56aef598","updated":"2020-03-12 11:19:06.000000000","message":"Done","commit_id":"d1dc9eeb9681853a58a2082a741136a9f3ecfe43"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        :param task: a TaskManager instance"},{"line_number":635,"context_line":"        :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":636,"context_line":"        :raises: NodeCleaningFailure if the agent returns invalid results"},{"line_number":637,"context_line":"        \"\"\""},{"line_number":638,"context_line":"        node \u003d task.node"},{"line_number":639,"context_line":"        previous_steps \u003d node.driver_internal_info.get("}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_8e7d8ce9","line":636,"range":{"start_line":636,"start_character":17,"end_line":636,"end_character":36},"updated":"2020-03-23 16:00:29.000000000","message":"Cleaning","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        :param task: a TaskManager instance"},{"line_number":635,"context_line":"        :param step_type: \u0027clean\u0027 or \u0027deploy\u0027"},{"line_number":636,"context_line":"        :raises: NodeCleaningFailure if the agent returns invalid results"},{"line_number":637,"context_line":"        \"\"\""},{"line_number":638,"context_line":"        node \u003d task.node"},{"line_number":639,"context_line":"        previous_steps \u003d node.driver_internal_info.get("}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_49553050","line":636,"range":{"start_line":636,"start_character":17,"end_line":636,"end_character":36},"in_reply_to":"df33271e_8e7d8ce9","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":648,"context_line":"        missing \u003d set([\u0027%s_steps\u0027 % step_type,"},{"line_number":649,"context_line":"                       \u0027hardware_manager_version\u0027]).difference(agent_result)"},{"line_number":650,"context_line":"        if missing:"},{"line_number":651,"context_line":"            raise exception.NodeCleaningFailure(_("},{"line_number":652,"context_line":"                \u0027agent get_%(type)s_steps for node %(node)s returned an \u0027"},{"line_number":653,"context_line":"                \u0027invalid result. Keys: %(keys)s are missing from result: \u0027"},{"line_number":654,"context_line":"                \u0027%(result)s.\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_ae7850f8","line":651,"range":{"start_line":651,"start_character":32,"end_line":651,"end_character":40},"updated":"2020-03-23 16:00:29.000000000","message":"Cleaning","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":648,"context_line":"        missing \u003d set([\u0027%s_steps\u0027 % step_type,"},{"line_number":649,"context_line":"                       \u0027hardware_manager_version\u0027]).difference(agent_result)"},{"line_number":650,"context_line":"        if missing:"},{"line_number":651,"context_line":"            raise exception.NodeCleaningFailure(_("},{"line_number":652,"context_line":"                \u0027agent get_%(type)s_steps for node %(node)s returned an \u0027"},{"line_number":653,"context_line":"                \u0027invalid result. Keys: %(keys)s are missing from result: \u0027"},{"line_number":654,"context_line":"                \u0027%(result)s.\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_e9d524bb","line":651,"range":{"start_line":651,"start_character":32,"end_line":651,"end_character":40},"in_reply_to":"df33271e_ae7850f8","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                missing \u003d set([\u0027interface\u0027, \u0027step\u0027, \u0027priority\u0027]).difference("},{"line_number":664,"context_line":"                    step)"},{"line_number":665,"context_line":"                if missing:"},{"line_number":666,"context_line":"                    raise exception.NodeCleaningFailure(_("},{"line_number":667,"context_line":"                        \u0027agent get_%(type)s_steps for node %(node)s returned \u0027"},{"line_number":668,"context_line":"                        \u0027an invalid %(type)s step. Keys: %(keys)s are missing\u0027"},{"line_number":669,"context_line":"                        \u0027from step: %(step)s.\u0027) % ({\u0027node\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_8ec2ace8","line":666,"range":{"start_line":666,"start_character":40,"end_line":666,"end_character":48},"updated":"2020-03-23 16:00:29.000000000","message":"Cleaning","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                missing \u003d set([\u0027interface\u0027, \u0027step\u0027, \u0027priority\u0027]).difference("},{"line_number":664,"context_line":"                    step)"},{"line_number":665,"context_line":"                if missing:"},{"line_number":666,"context_line":"                    raise exception.NodeCleaningFailure(_("},{"line_number":667,"context_line":"                        \u0027agent get_%(type)s_steps for node %(node)s returned \u0027"},{"line_number":668,"context_line":"                        \u0027an invalid %(type)s step. Keys: %(keys)s are missing\u0027"},{"line_number":669,"context_line":"                        \u0027from step: %(step)s.\u0027) % ({\u0027node\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_49da50e9","line":666,"range":{"start_line":666,"start_character":40,"end_line":666,"end_character":48},"in_reply_to":"df33271e_8ec2ace8","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        \"\"\""},{"line_number":699,"context_line":"        return execute_step(task, step, \u0027clean\u0027)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"    @METRICS.timer(\u0027AgentDeployMixin.process_next_steps\u0027)"},{"line_number":702,"context_line":"    def process_next_step(self, task, step_type, **kwargs):"},{"line_number":703,"context_line":"        \"\"\"Start the next clean/deploy step if the previous one is complete."},{"line_number":704,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_ce183483","line":701,"range":{"start_line":701,"start_character":50,"end_line":701,"end_character":55},"updated":"2020-03-23 16:00:29.000000000","message":"step","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        \"\"\""},{"line_number":699,"context_line":"        return execute_step(task, step, \u0027clean\u0027)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"    @METRICS.timer(\u0027AgentDeployMixin.process_next_steps\u0027)"},{"line_number":702,"context_line":"    def process_next_step(self, task, step_type, **kwargs):"},{"line_number":703,"context_line":"        \"\"\"Start the next clean/deploy step if the previous one is complete."},{"line_number":704,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_89e458ae","line":701,"range":{"start_line":701,"start_character":50,"end_line":701,"end_character":55},"in_reply_to":"df33271e_ce183483","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":702,"context_line":"    def process_next_step(self, task, step_type, **kwargs):"},{"line_number":703,"context_line":"        \"\"\"Start the next clean/deploy step if the previous one is complete."},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        In order to avoid errors and make agent upgrades painless, the agent"},{"line_number":706,"context_line":"        compares the version of all hardware managers at the start of the"},{"line_number":707,"context_line":"        cleaning (the agent\u0027s get_clean_steps() call) and before executing"},{"line_number":708,"context_line":"        each clean step. If the version has changed between steps, the agent is"},{"line_number":709,"context_line":"        unable to tell if an ordering change will cause a cleaning issue so"},{"line_number":710,"context_line":"        it returns CLEAN_VERSION_MISMATCH. For automated cleaning, we restart"},{"line_number":711,"context_line":"        the entire cleaning cycle. For manual cleaning or deploy, we don\u0027t."},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        Additionally, if a clean_step includes the reboot_requested property"},{"line_number":714,"context_line":"        set to True, this method will coordinate the reboot once the step is"},{"line_number":715,"context_line":"        completed."},{"line_number":716,"context_line":"        \"\"\""},{"line_number":717,"context_line":"        assert step_type in (\u0027clean\u0027, \u0027deploy\u0027)"},{"line_number":718,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_b1fef502","line":715,"range":{"start_line":705,"start_character":0,"end_line":715,"end_character":18},"updated":"2020-03-23 16:00:29.000000000","message":"needs decleaning","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":702,"context_line":"    def process_next_step(self, task, step_type, **kwargs):"},{"line_number":703,"context_line":"        \"\"\"Start the next clean/deploy step if the previous one is complete."},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        In order to avoid errors and make agent upgrades painless, the agent"},{"line_number":706,"context_line":"        compares the version of all hardware managers at the start of the"},{"line_number":707,"context_line":"        cleaning (the agent\u0027s get_clean_steps() call) and before executing"},{"line_number":708,"context_line":"        each clean step. If the version has changed between steps, the agent is"},{"line_number":709,"context_line":"        unable to tell if an ordering change will cause a cleaning issue so"},{"line_number":710,"context_line":"        it returns CLEAN_VERSION_MISMATCH. For automated cleaning, we restart"},{"line_number":711,"context_line":"        the entire cleaning cycle. For manual cleaning or deploy, we don\u0027t."},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        Additionally, if a clean_step includes the reboot_requested property"},{"line_number":714,"context_line":"        set to True, this method will coordinate the reboot once the step is"},{"line_number":715,"context_line":"        completed."},{"line_number":716,"context_line":"        \"\"\""},{"line_number":717,"context_line":"        assert step_type in (\u0027clean\u0027, \u0027deploy\u0027)"},{"line_number":718,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_a9f4bc5c","line":715,"range":{"start_line":705,"start_character":0,"end_line":715,"end_character":18},"in_reply_to":"df33271e_b1fef502","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":720,"context_line":"        # For manual clean, the target provision state is MANAGEABLE, whereas"},{"line_number":721,"context_line":"        # for automated cleaning, it is (the default) AVAILABLE."},{"line_number":722,"context_line":"        manual_clean \u003d node.target_provision_state \u003d\u003d states.MANAGEABLE"},{"line_number":723,"context_line":"        reboot_on_conflict \u003d step_type \u003d\u003d \u0027clean\u0027 and not manual_clean"},{"line_number":724,"context_line":"        agent_commands \u003d self._client.get_commands_status(task.node)"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":"        if not agent_commands:"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_515169d8","line":723,"range":{"start_line":723,"start_character":8,"end_line":723,"end_character":26},"updated":"2020-03-23 16:00:29.000000000","message":"I\u0027m not sure what the behaviour should be for deploys if the version changes. Maybe restarting would be better?","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":720,"context_line":"        # For manual clean, the target provision state is MANAGEABLE, whereas"},{"line_number":721,"context_line":"        # for automated cleaning, it is (the default) AVAILABLE."},{"line_number":722,"context_line":"        manual_clean \u003d node.target_provision_state \u003d\u003d states.MANAGEABLE"},{"line_number":723,"context_line":"        reboot_on_conflict \u003d step_type \u003d\u003d \u0027clean\u0027 and not manual_clean"},{"line_number":724,"context_line":"        agent_commands \u003d self._client.get_commands_status(task.node)"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":"        if not agent_commands:"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_a9679c25","line":723,"range":{"start_line":723,"start_character":8,"end_line":723,"end_character":26},"in_reply_to":"df33271e_515169d8","updated":"2020-03-24 11:50:10.000000000","message":"I\u0027m not sure either. Automated cleaning is supposed to be idempotent, but what about deployment? I also don\u0027t know how realistic it is for a version to change mid-deployment.\n\nI guess it makes sense to do a full restart, although a potential of going in a loop scares me somewhat.","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"cb02939ce0b7d2a8a1f7651c3387722f730702ac","unresolved":false,"context_lines":[{"line_number":720,"context_line":"        # For manual clean, the target provision state is MANAGEABLE, whereas"},{"line_number":721,"context_line":"        # for automated cleaning, it is (the default) AVAILABLE."},{"line_number":722,"context_line":"        manual_clean \u003d node.target_provision_state \u003d\u003d states.MANAGEABLE"},{"line_number":723,"context_line":"        reboot_on_conflict \u003d step_type \u003d\u003d \u0027clean\u0027 and not manual_clean"},{"line_number":724,"context_line":"        agent_commands \u003d self._client.get_commands_status(task.node)"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":"        if not agent_commands:"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_4b199f83","line":723,"range":{"start_line":723,"start_character":8,"end_line":723,"end_character":26},"in_reply_to":"df33271e_a9679c25","updated":"2020-03-24 17:09:54.000000000","message":"Ideally each step would be idempotent. I don\u0027t know if we can guarantee it though. Typically for deployment if anything goes wrong we just fail rather than try to retry. That has its own issues also though, as it makes the system appear less reliable.","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":781,"context_line":"                return manager_utils.deploying_error_handler(task, msg)"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"            if not reboot_on_conflict:"},{"line_number":784,"context_line":"                # Don\u0027t restart manual cleaning if agent reboots to a new"},{"line_number":785,"context_line":"                # version. Both are operator actions, unlike automated"},{"line_number":786,"context_line":"                # cleaning. Manual clean steps are not necessarily idempotent"},{"line_number":787,"context_line":"                # like automated clean steps and can be even longer running."}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_d1f739f5","line":784,"range":{"start_line":784,"start_character":32,"end_line":784,"end_character":47},"updated":"2020-03-23 16:00:29.000000000","message":"or deploy","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"80d8d99de9b5c78947b42dbff17199f1ebee3b84","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    \"\"\"Decorator method for adding a post deploy step hook."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    This is a mechanism for adding a post deploy step hook for a particular"},{"line_number":129,"context_line":"    deploy step.  The hook will get executed after the deploy step gets"},{"line_number":130,"context_line":"    executed successfully.  The hook is not invoked on failure of the deploy"},{"line_number":131,"context_line":"    step."},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_214a457f","line":129,"range":{"start_line":129,"start_character":16,"end_line":129,"end_character":17},"updated":"2020-03-27 10:26:28.000000000","message":"nit: remove blank space","commit_id":"16bce7f18d2a18cde9c4b18c24d1fb7973dc8ac2"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"80d8d99de9b5c78947b42dbff17199f1ebee3b84","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    This is a mechanism for adding a post deploy step hook for a particular"},{"line_number":129,"context_line":"    deploy step.  The hook will get executed after the deploy step gets"},{"line_number":130,"context_line":"    executed successfully.  The hook is not invoked on failure of the deploy"},{"line_number":131,"context_line":"    step."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    Any method to be made as a hook may be decorated with"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_615bad53","line":130,"range":{"start_line":130,"start_character":26,"end_line":130,"end_character":27},"updated":"2020-03-27 10:26:28.000000000","message":"nit: ditto","commit_id":"16bce7f18d2a18cde9c4b18c24d1fb7973dc8ac2"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"80d8d99de9b5c78947b42dbff17199f1ebee3b84","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    Any method to be made as a hook may be decorated with"},{"line_number":134,"context_line":"    @post_deploy_step_hook mentioning the interface and step after which the"},{"line_number":135,"context_line":"    hook should be executed.  A TaskManager instance and the object for the"},{"line_number":136,"context_line":"    last completed command (provided by agent) will be passed to the hook"},{"line_number":137,"context_line":"    method. The return value of this method will be ignored. Any exception"},{"line_number":138,"context_line":"    raised by this method will be treated as a failure of the deploy step and"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_0132a110","line":135,"range":{"start_line":135,"start_character":28,"end_line":135,"end_character":29},"updated":"2020-03-27 10:26:28.000000000","message":"nit: ditto","commit_id":"16bce7f18d2a18cde9c4b18c24d1fb7973dc8ac2"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"80d8d99de9b5c78947b42dbff17199f1ebee3b84","unresolved":false,"context_lines":[{"line_number":400,"context_line":"        \"\"\""},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"    def refresh_steps(self, task, step_type):"},{"line_number":403,"context_line":"        \"\"\"Refresh the node\u0027s cached clean steps"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        :param task: a TaskManager instance"},{"line_number":406,"context_line":"        :param step_type: \"clean\" or \"deploy\""}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_f4601da8","line":403,"range":{"start_line":403,"start_character":37,"end_line":403,"end_character":42},"updated":"2020-03-27 10:26:28.000000000","message":"nit: clean/deploy","commit_id":"16bce7f18d2a18cde9c4b18c24d1fb7973dc8ac2"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"80d8d99de9b5c78947b42dbff17199f1ebee3b84","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        :param step_type: \"clean\" or \"deploy\""},{"line_number":407,"context_line":"        \"\"\""},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def refresh_clean_steps(self, task):"},{"line_number":410,"context_line":"        \"\"\"Refresh the node\u0027s cached clean steps"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        :param task: a TaskManager instance"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_b46e9592","line":409,"updated":"2020-03-27 10:26:28.000000000","message":"I guess we\u0027re leaving this for the same reason as execute_clean_step","commit_id":"16bce7f18d2a18cde9c4b18c24d1fb7973dc8ac2"}],"ironic/tests/unit/drivers/modules/test_agent.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            clean_dhcp_mock.assert_called_once_with(task)"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"    @mock.patch.object(agent_base, \u0027get_steps\u0027, autospec\u003dTrue)"},{"line_number":977,"context_line":"    def test_get_clean_steps(self, mock_get_clean_steps):"},{"line_number":978,"context_line":"        # Test getting clean steps"},{"line_number":979,"context_line":"        mock_steps \u003d [{\u0027priority\u0027: 10, \u0027interface\u0027: \u0027deploy\u0027,"},{"line_number":980,"context_line":"                       \u0027step\u0027: \u0027erase_devices\u0027}]"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_f1b51df0","line":977,"range":{"start_line":977,"start_character":35,"end_line":977,"end_character":55},"updated":"2020-03-23 16:00:29.000000000","message":"mock_get_steps","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            clean_dhcp_mock.assert_called_once_with(task)"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"    @mock.patch.object(agent_base, \u0027get_steps\u0027, autospec\u003dTrue)"},{"line_number":977,"context_line":"    def test_get_clean_steps(self, mock_get_clean_steps):"},{"line_number":978,"context_line":"        # Test getting clean steps"},{"line_number":979,"context_line":"        mock_steps \u003d [{\u0027priority\u0027: 10, \u0027interface\u0027: \u0027deploy\u0027,"},{"line_number":980,"context_line":"                       \u0027step\u0027: \u0027erase_devices\u0027}]"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_bcfebc02","line":977,"range":{"start_line":977,"start_character":35,"end_line":977,"end_character":55},"in_reply_to":"df33271e_f1b51df0","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":988,"context_line":"        self.assertEqual(mock_steps, steps)"},{"line_number":989,"context_line":""},{"line_number":990,"context_line":"    @mock.patch.object(agent_base, \u0027get_steps\u0027, autospec\u003dTrue)"},{"line_number":991,"context_line":"    def test_get_clean_steps_config_priority(self, mock_get_clean_steps):"},{"line_number":992,"context_line":"        # Test that we can override the priority of get clean steps"},{"line_number":993,"context_line":"        # Use 0 because it is an edge case (false-y) and used in devstack"},{"line_number":994,"context_line":"        self.config(erase_devices_priority\u003d0, group\u003d\u0027deploy\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_31cf8580","line":991,"range":{"start_line":991,"start_character":51,"end_line":991,"end_character":71},"updated":"2020-03-23 16:00:29.000000000","message":"ditto","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"}],"ironic/tests/unit/drivers/modules/test_agent_base.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":1532,"context_line":"            i_info \u003d task.node.driver_internal_info"},{"line_number":1533,"context_line":"            i_info[\u0027agent_secret_token\u0027] \u003d \u0027magicvalue01\u0027"},{"line_number":1534,"context_line":"            task.node.driver_internal_info \u003d i_info"},{"line_number":1535,"context_line":"            agent_base._post_step_reboot(task, \u0027clean\u0027)"},{"line_number":1536,"context_line":"            self.assertTrue(mock_build_opt.called)"},{"line_number":1537,"context_line":"            self.assertTrue(mock_prepare.called)"},{"line_number":1538,"context_line":"            mock_reboot.assert_called_once_with(task, states.REBOOT)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_31dae5e8","line":1535,"range":{"start_line":1535,"start_character":48,"end_line":1535,"end_character":53},"updated":"2020-03-23 16:00:29.000000000","message":"test deploy?","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":1532,"context_line":"            i_info \u003d task.node.driver_internal_info"},{"line_number":1533,"context_line":"            i_info[\u0027agent_secret_token\u0027] \u003d \u0027magicvalue01\u0027"},{"line_number":1534,"context_line":"            task.node.driver_internal_info \u003d i_info"},{"line_number":1535,"context_line":"            agent_base._post_step_reboot(task, \u0027clean\u0027)"},{"line_number":1536,"context_line":"            self.assertTrue(mock_build_opt.called)"},{"line_number":1537,"context_line":"            self.assertTrue(mock_prepare.called)"},{"line_number":1538,"context_line":"            mock_reboot.assert_called_once_with(task, states.REBOOT)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_dc0d8038","line":1535,"range":{"start_line":1535,"start_character":48,"end_line":1535,"end_character":53},"in_reply_to":"df33271e_31dae5e8","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":1962,"context_line":""},{"line_number":1963,"context_line":"        with task_manager.acquire("},{"line_number":1964,"context_line":"                self.context, self.node.uuid, shared\u003dFalse) as task:"},{"line_number":1965,"context_line":"            self.deploy.refresh_steps(task, \u0027clean\u0027)"},{"line_number":1966,"context_line":""},{"line_number":1967,"context_line":"            client_mock.assert_called_once_with(mock.ANY, task.node,"},{"line_number":1968,"context_line":"                                                task.ports)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_91665151","line":1965,"range":{"start_line":1965,"start_character":45,"end_line":1965,"end_character":50},"updated":"2020-03-23 16:00:29.000000000","message":"What about testing with deploy?","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":1962,"context_line":""},{"line_number":1963,"context_line":"        with task_manager.acquire("},{"line_number":1964,"context_line":"                self.context, self.node.uuid, shared\u003dFalse) as task:"},{"line_number":1965,"context_line":"            self.deploy.refresh_steps(task, \u0027clean\u0027)"},{"line_number":1966,"context_line":""},{"line_number":1967,"context_line":"            client_mock.assert_called_once_with(mock.ANY, task.node,"},{"line_number":1968,"context_line":"                                                task.ports)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_dc2620b8","line":1965,"range":{"start_line":1965,"start_character":45,"end_line":1965,"end_character":50},"in_reply_to":"df33271e_91665151","updated":"2020-03-24 11:50:10.000000000","message":"I suspect they have very minor differences, but I can add.","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"    def test_agent_get_steps(self):"},{"line_number":2047,"context_line":"        with task_manager.acquire("},{"line_number":2048,"context_line":"                self.context, self.node.uuid, shared\u003dFalse) as task:"},{"line_number":2049,"context_line":"            response \u003d agent_base.get_steps(task, \u0027clean\u0027)"},{"line_number":2050,"context_line":""},{"line_number":2051,"context_line":"            # Since steps are returned in dicts, they have non-deterministic"},{"line_number":2052,"context_line":"            # ordering"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_d160d935","line":2049,"range":{"start_line":2049,"start_character":51,"end_line":2049,"end_character":56},"updated":"2020-03-23 16:00:29.000000000","message":"ditto","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":2102,"context_line":"        with task_manager.acquire("},{"line_number":2103,"context_line":"                self.context, self.node.uuid, shared\u003dFalse) as task:"},{"line_number":2104,"context_line":"            response \u003d agent_base.execute_step("},{"line_number":2105,"context_line":"                task, self.clean_steps[\u0027deploy\u0027][0], \u0027clean\u0027)"},{"line_number":2106,"context_line":"            self.assertEqual(states.CLEANWAIT, response)"},{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    @mock.patch(\u0027ironic.objects.Port.list_by_node_id\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_714f4dbd","line":2105,"range":{"start_line":2105,"start_character":54,"end_line":2105,"end_character":59},"updated":"2020-03-23 16:00:29.000000000","message":"ditto","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":2102,"context_line":"        with task_manager.acquire("},{"line_number":2103,"context_line":"                self.context, self.node.uuid, shared\u003dFalse) as task:"},{"line_number":2104,"context_line":"            response \u003d agent_base.execute_step("},{"line_number":2105,"context_line":"                task, self.clean_steps[\u0027deploy\u0027][0], \u0027clean\u0027)"},{"line_number":2106,"context_line":"            self.assertEqual(states.CLEANWAIT, response)"},{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    @mock.patch(\u0027ironic.objects.Port.list_by_node_id\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_5c6050cf","line":2105,"range":{"start_line":2105,"start_character":54,"end_line":2105,"end_character":59},"in_reply_to":"df33271e_714f4dbd","updated":"2020-03-24 11:50:10.000000000","message":"Done","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e97c53e3544403cc799ced5ab8529b8875ef81b2","unresolved":false,"context_lines":[{"line_number":2044,"context_line":"            self.assertEqual({\u0027deploy\u0027, \u0027raid\u0027}, set(steps))"},{"line_number":2045,"context_line":"            # Since steps are returned in dicts, they have non-deterministic"},{"line_number":2046,"context_line":"            # ordering"},{"line_number":2047,"context_line":"            self.assertIn(self.clean_steps[\u0027clean_steps\u0027]["},{"line_number":2048,"context_line":"                \u0027GenericHardwareManager\u0027][0], steps[\u0027deploy\u0027])"},{"line_number":2049,"context_line":"            self.assertIn(self.clean_steps[\u0027clean_steps\u0027]["},{"line_number":2050,"context_line":"                \u0027SpecificHardwareManager\u0027][0], steps[\u0027deploy\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"df33271e_9973f415","line":2047,"range":{"start_line":2047,"start_character":26,"end_line":2047,"end_character":57},"updated":"2020-03-25 10:23:02.000000000","message":"self.deploy_steps[\u0027deploy_steps\u0027]","commit_id":"123230e4c8ea1bd1a004baa161ec14d6284fa30c"}],"ironic/tests/unit/drivers/modules/test_iscsi_deploy.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"f23c83aaf94144d9031c8d2e26690da5e264faed","unresolved":false,"context_lines":[{"line_number":976,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":977,"context_line":"            steps \u003d task.driver.deploy.get_clean_steps(task)"},{"line_number":978,"context_line":"            mock_get_clean_steps.assert_called_once_with("},{"line_number":979,"context_line":"                task, \u0027clean\u0027, interface\u003d\u0027deploy\u0027,"},{"line_number":980,"context_line":"                override_priorities\u003d{"},{"line_number":981,"context_line":"                    \u0027erase_devices\u0027: 10,"},{"line_number":982,"context_line":"                    \u0027erase_devices_metadata\u0027: 5})"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_f1d07dcc","line":979,"range":{"start_line":979,"start_character":23,"end_line":979,"end_character":28},"updated":"2020-03-23 16:00:29.000000000","message":"test deploy?","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"69591a25812d40473e85310e0d8dba2e07bafe38","unresolved":false,"context_lines":[{"line_number":976,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":977,"context_line":"            steps \u003d task.driver.deploy.get_clean_steps(task)"},{"line_number":978,"context_line":"            mock_get_clean_steps.assert_called_once_with("},{"line_number":979,"context_line":"                task, \u0027clean\u0027, interface\u003d\u0027deploy\u0027,"},{"line_number":980,"context_line":"                override_priorities\u003d{"},{"line_number":981,"context_line":"                    \u0027erase_devices\u0027: 10,"},{"line_number":982,"context_line":"                    \u0027erase_devices_metadata\u0027: 5})"}],"source_content_type":"text/x-python","patch_set":5,"id":"df33271e_7cb8b429","line":979,"range":{"start_line":979,"start_character":23,"end_line":979,"end_character":28},"in_reply_to":"df33271e_f1d07dcc","updated":"2020-03-24 11:50:10.000000000","message":"I don\u0027t think we introduce get_deploy_steps in this patch yet.","commit_id":"1318b3c66c367f7e25c57a7e56b5e498eb1ff6b5"}]}
