)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2e83b66c0226afa548b0d86ce88a4cd7c57cfdc2","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2019-08-02 06:37:05 -0400"},{"line_number":4,"context_line":"Commit:     Shivanand Tendulker \u003cstendulker@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-08-14 07:28:32 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Add iDRAC RAID deploy steps"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Shivanand Tendulker \u003cstendulker@gmail.com\u003e"},{"line_number":10,"context_line":"Change-Id: I5803131fbdebce6f7896655a61a8fbdd4c1cd4a1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7faddb67_b9e31505","line":7,"range":{"start_line":6,"start_character":0,"end_line":7,"end_character":5},"updated":"2019-08-15 17:34:52.000000000","message":"Is this really still a WIP, LGTM","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8887edbef5e27ecdc1d6686ed074040270aba5df","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2019-08-02 06:37:05 -0400"},{"line_number":4,"context_line":"Commit:     Shivanand Tendulker \u003cstendulker@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-08-14 07:28:32 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Add iDRAC RAID deploy steps"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Shivanand Tendulker \u003cstendulker@gmail.com\u003e"},{"line_number":10,"context_line":"Change-Id: I5803131fbdebce6f7896655a61a8fbdd4c1cd4a1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7faddb67_c966ee29","line":7,"range":{"start_line":6,"start_character":0,"end_line":7,"end_character":5},"in_reply_to":"7faddb67_b9e31505","updated":"2019-08-21 10:48:37.000000000","message":"It was WIP, when I started it. Have only rebased and changed it based on parent patches. Have not tested it with real hardware, so not aware if all works and there are no further code changes required. \n@Mark: You had even demoed this at last summit. Can we remove WIP flag?","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"bd3c8626997f01582abc54e739fce728313e1eb3","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2019-08-02 06:37:05 -0400"},{"line_number":4,"context_line":"Commit:     Shivanand Tendulker \u003cstendulker@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-08-14 07:28:32 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Add iDRAC RAID deploy steps"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Shivanand Tendulker \u003cstendulker@gmail.com\u003e"},{"line_number":10,"context_line":"Change-Id: I5803131fbdebce6f7896655a61a8fbdd4c1cd4a1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7faddb67_1c5670cf","line":7,"range":{"start_line":6,"start_character":0,"end_line":7,"end_character":5},"in_reply_to":"7faddb67_c966ee29","updated":"2019-08-22 08:52:11.000000000","message":"It\u0027s had a few changes since I pushed it, including changes to the surrounding drac driver code. It should be fine, but would be nice to test it on hardware again.","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"}],"ironic/conductor/manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"262a6b961dd970f494c7e36521fea677e202ede9","unresolved":false,"context_lines":[{"line_number":3821,"context_line":"            result \u003d interface.execute_deploy_step(task, step)"},{"line_number":3822,"context_line":"        except exception.IronicException as e:"},{"line_number":3823,"context_line":"            if isinstance(e, exception.AgentConnectionFailed):"},{"line_number":3824,"context_line":"                if task.node.driver_internal_info.get(\u0027deployment_reboot\u0027):"},{"line_number":3825,"context_line":"                    LOG.info(\u0027Agent is not yet running on node %(node)s after \u0027"},{"line_number":3826,"context_line":"                             \u0027deployment reboot, waiting for agent to come up \u0027"},{"line_number":3827,"context_line":"                             \u0027to run next deploy step %(step)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_ab122e57","line":3824,"updated":"2019-03-07 17:54:55.000000000","message":"I\u0027m a bit lost here. Looks like \u0027deployment_reboot\u0027 is added via drac/raid\u0027s _resume(). So does it mean that the node has finished rebooting and is up when this is added?\n\nWondering, based on the provision state of the node, whether the \u0027deployment_\u0027 part is needed. Just want to know if the node has been rebooted?\n\nAh, it is because drac/raid had used \u0027cleaning_reboot\u0027. We probably want to think about this to decide how we want to generalize stuff that was only in a particular driver.","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"681e7a5d5499efe87cb2d387905e7835f31b17d5","unresolved":false,"context_lines":[{"line_number":3821,"context_line":"            result \u003d interface.execute_deploy_step(task, step)"},{"line_number":3822,"context_line":"        except exception.IronicException as e:"},{"line_number":3823,"context_line":"            if isinstance(e, exception.AgentConnectionFailed):"},{"line_number":3824,"context_line":"                if task.node.driver_internal_info.get(\u0027deployment_reboot\u0027):"},{"line_number":3825,"context_line":"                    LOG.info(\u0027Agent is not yet running on node %(node)s after \u0027"},{"line_number":3826,"context_line":"                             \u0027deployment reboot, waiting for agent to come up \u0027"},{"line_number":3827,"context_line":"                             \u0027to run next deploy step %(step)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_a4a1efab","line":3824,"in_reply_to":"5fc1f717_ab122e57","updated":"2019-03-08 12:10:44.000000000","message":"From what I can tell, cleaning_reboot is used by drivers to show that the node has been rebooted. It\u0027s then used to ignore connection errors to the agent until it boots.\n\nThe slight difference for deploy steps is that the agent isn\u0027t normally up at that point, so we wouldn\u0027t expect to connect to the agent. I\u0027m not sure if it\u0027s necessary right now, but might be in future if we allow deploy steps with the agent active.","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"262a6b961dd970f494c7e36521fea677e202ede9","unresolved":false,"context_lines":[{"line_number":3855,"context_line":"            node.save()"},{"line_number":3856,"context_line":""},{"line_number":3857,"context_line":"        # Check if the step is done or not. The step should return"},{"line_number":3858,"context_line":"        # states.CLEANWAIT if the step is still being executed, or"},{"line_number":3859,"context_line":"        # None if the step is done."},{"line_number":3860,"context_line":"        # NOTE(deva): Some drivers may return states.DEPLOYWAIT"},{"line_number":3861,"context_line":"        #             eg. if they are waiting for a callback"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_8845f8b5","line":3858,"updated":"2019-03-07 17:54:55.000000000","message":"this isn\u0027t true? i wonder if i copy/pasted before and forgot to update.","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"681e7a5d5499efe87cb2d387905e7835f31b17d5","unresolved":false,"context_lines":[{"line_number":3855,"context_line":"            node.save()"},{"line_number":3856,"context_line":""},{"line_number":3857,"context_line":"        # Check if the step is done or not. The step should return"},{"line_number":3858,"context_line":"        # states.CLEANWAIT if the step is still being executed, or"},{"line_number":3859,"context_line":"        # None if the step is done."},{"line_number":3860,"context_line":"        # NOTE(deva): Some drivers may return states.DEPLOYWAIT"},{"line_number":3861,"context_line":"        #             eg. if they are waiting for a callback"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_e49e1762","line":3858,"in_reply_to":"5fc1f717_8845f8b5","updated":"2019-03-08 12:10:44.000000000","message":"I think it is true, but should be DEPLOYWAIT.","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"262a6b961dd970f494c7e36521fea677e202ede9","unresolved":false,"context_lines":[{"line_number":3859,"context_line":"        # None if the step is done."},{"line_number":3860,"context_line":"        # NOTE(deva): Some drivers may return states.DEPLOYWAIT"},{"line_number":3861,"context_line":"        #             eg. if they are waiting for a callback"},{"line_number":3862,"context_line":"        if result \u003d\u003d states.DEPLOYWAIT:"},{"line_number":3863,"context_line":"            # Kill this worker, the async step will make an RPC call to"},{"line_number":3864,"context_line":"            # continue_node_deploy() to continue deploying"},{"line_number":3865,"context_line":"            LOG.info(\u0027Deploy step %(step)s on node %(node)s being \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_287964fb","line":3862,"updated":"2019-03-07 17:54:55.000000000","message":"i wonder if that execute_deploy_step above (L3823) can be handled here instead. I haven\u0027t looked at the driver changes yet.","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"681e7a5d5499efe87cb2d387905e7835f31b17d5","unresolved":false,"context_lines":[{"line_number":3859,"context_line":"        # None if the step is done."},{"line_number":3860,"context_line":"        # NOTE(deva): Some drivers may return states.DEPLOYWAIT"},{"line_number":3861,"context_line":"        #             eg. if they are waiting for a callback"},{"line_number":3862,"context_line":"        if result \u003d\u003d states.DEPLOYWAIT:"},{"line_number":3863,"context_line":"            # Kill this worker, the async step will make an RPC call to"},{"line_number":3864,"context_line":"            # continue_node_deploy() to continue deploying"},{"line_number":3865,"context_line":"            LOG.info(\u0027Deploy step %(step)s on node %(node)s being \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_e4c5b73d","line":3862,"in_reply_to":"5fc1f717_287964fb","updated":"2019-03-08 12:10:44.000000000","message":"I\u0027m not sure what you mean here.","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"}],"ironic/drivers/base.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"681e7a5d5499efe87cb2d387905e7835f31b17d5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                                  \u0027raid_config_schema.json\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def _validate_argsinfo(argsinfo):"},{"line_number":43,"context_line":"    \"\"\"Validate args info."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    This method validates args info, so that the values are the expected"},{"line_number":46,"context_line":"    data types and required values are specified."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    :param argsinfo: a dictionary of keyword arguments where key is the name of"},{"line_number":49,"context_line":"        the argument and value is a dictionary as follows::"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            \u0027description\u0027: \u003cdescription\u003e. Required. This should include"},{"line_number":52,"context_line":"                           possible values."},{"line_number":53,"context_line":"            \u0027required\u0027: Boolean. Optional; default is False. True if this"},{"line_number":54,"context_line":"                        argument is required.  If so, it must be specified in"},{"line_number":55,"context_line":"                        the clean request; false if it is optional."},{"line_number":56,"context_line":"    :raises InvalidParameterValue: if any of the arguments are invalid"},{"line_number":57,"context_line":"    \"\"\""},{"line_number":58,"context_line":"    if not argsinfo:"},{"line_number":59,"context_line":"        return"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    if not isinstance(argsinfo, dict):"},{"line_number":62,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":63,"context_line":"            _(\u0027\"argsinfo\" must be a dictionary instead of \"%s\"\u0027) %"},{"line_number":64,"context_line":"            argsinfo)"},{"line_number":65,"context_line":"    for (arg, info) in argsinfo.items():"},{"line_number":66,"context_line":"        if not isinstance(info, dict):"},{"line_number":67,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":68,"context_line":"                _(\u0027Argument \"%(arg)s\" must be a dictionary instead of \u0027"},{"line_number":69,"context_line":"                  \u0027\"%(val)s\".\u0027) % {\u0027arg\u0027: arg, \u0027val\u0027: info})"},{"line_number":70,"context_line":"        has_description \u003d False"},{"line_number":71,"context_line":"        for (key, value) in info.items():"},{"line_number":72,"context_line":"            if key \u003d\u003d \u0027description\u0027:"},{"line_number":73,"context_line":"                if not isinstance(value, six.string_types):"},{"line_number":74,"context_line":"                    raise exception.InvalidParameterValue("},{"line_number":75,"context_line":"                        _(\u0027For argument \"%(arg)s\", \"description\" must be a \u0027"},{"line_number":76,"context_line":"                          \u0027string value instead of \"%(value)s\".\u0027) %"},{"line_number":77,"context_line":"                        {\u0027arg\u0027: arg, \u0027value\u0027: value})"},{"line_number":78,"context_line":"                has_description \u003d True"},{"line_number":79,"context_line":"            elif key \u003d\u003d \u0027required\u0027:"},{"line_number":80,"context_line":"                if not isinstance(value, bool):"},{"line_number":81,"context_line":"                    raise exception.InvalidParameterValue("},{"line_number":82,"context_line":"                        _(\u0027For argument \"%(arg)s\", \"required\" must be a \u0027"},{"line_number":83,"context_line":"                          \u0027Boolean value instead of \"%(value)s\".\u0027) %"},{"line_number":84,"context_line":"                        {\u0027arg\u0027: arg, \u0027value\u0027: value})"},{"line_number":85,"context_line":"            else:"},{"line_number":86,"context_line":"                raise exception.InvalidParameterValue("},{"line_number":87,"context_line":"                    _(\u0027Argument \"%(arg)s\" has an invalid key named \"%(key)s\". \u0027"},{"line_number":88,"context_line":"                      \u0027It must be \"description\" or \"required\".\u0027)"},{"line_number":89,"context_line":"                    % {\u0027key\u0027: key, \u0027arg\u0027: arg})"},{"line_number":90,"context_line":"        if not has_description:"},{"line_number":91,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":92,"context_line":"                _(\u0027Argument \"%(arg)s\" is missing a \"description\".\u0027) %"},{"line_number":93,"context_line":"                {\u0027arg\u0027: arg})"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def clean_step(priority, abortable\u003dFalse, argsinfo\u003dNone):"},{"line_number":97,"context_line":"    \"\"\"Decorator for cleaning steps."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    Cleaning steps may be used in manual or automated cleaning."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    For automated cleaning, only steps with priorities greater than 0 are"},{"line_number":102,"context_line":"    used. These steps are ordered by priority from highest value to lowest"},{"line_number":103,"context_line":"    value. For steps with the same priority, they are ordered by driver"},{"line_number":104,"context_line":"    interface priority (see conductor.manager.CLEANING_INTERFACE_PRIORITY)."},{"line_number":105,"context_line":"    execute_clean_step() will be called on each step."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    For manual cleaning, the clean steps will be executed in a similar fashion"},{"line_number":108,"context_line":"    to automated cleaning, but the steps and order of execution must be"},{"line_number":109,"context_line":"    explicitly specified by the user when invoking the cleaning API."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    Decorated clean steps must take as the only positional argument, a"},{"line_number":112,"context_line":"    TaskManager object. Clean steps used in manual cleaning may also take"},{"line_number":113,"context_line":"    keyword variable arguments (as described in argsinfo)."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    Clean steps can be either synchronous or asynchronous.  If the step is"},{"line_number":116,"context_line":"    synchronous, it should return `None` when finished, and the conductor"},{"line_number":117,"context_line":"    will continue on to the next step. While the clean step is executing, the"},{"line_number":118,"context_line":"    node will be in `states.CLEANING` provision state. If the step is"},{"line_number":119,"context_line":"    asynchronous, the step should return `states.CLEANWAIT` to the"},{"line_number":120,"context_line":"    conductor before it starts the asynchronous work.  When the step is"},{"line_number":121,"context_line":"    complete, the step should make an RPC call to `continue_node_clean` to"},{"line_number":122,"context_line":"    move to the next step in cleaning. The node will be in `states.CLEANWAIT`"},{"line_number":123,"context_line":"    provision state during the asynchronous work."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    Examples::"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        class MyInterface(base.BaseInterface):"},{"line_number":128,"context_line":"            # CONF.example_cleaning_priority should be an int CONF option"},{"line_number":129,"context_line":"            @base.clean_step(priority\u003dCONF.example_cleaning_priority)"},{"line_number":130,"context_line":"            def example_cleaning(self, task):"},{"line_number":131,"context_line":"                # do some cleaning"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"            @base.clean_step(priority\u003d0, abortable\u003dTrue, argsinfo\u003d"},{"line_number":134,"context_line":"                             {\u0027size\u0027: {\u0027description\u0027: \u0027size of widget (MB)\u0027,"},{"line_number":135,"context_line":"                                       \u0027required\u0027: True}})"},{"line_number":136,"context_line":"            def advanced_clean(self, task, **kwargs):"},{"line_number":137,"context_line":"                # do some advanced cleaning"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    :param priority: an integer priority, should be a CONF option"},{"line_number":140,"context_line":"    :param abortable: Boolean value. Whether the clean step is abortable"},{"line_number":141,"context_line":"        or not; defaults to False."},{"line_number":142,"context_line":"    :param argsinfo: a dictionary of keyword arguments where key is the name of"},{"line_number":143,"context_line":"        the argument and value is a dictionary as follows::"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            \u0027description\u0027: \u003cdescription\u003e. Required. This should include"},{"line_number":146,"context_line":"                           possible values."},{"line_number":147,"context_line":"            \u0027required\u0027: Boolean. Optional; default is False. True if this"},{"line_number":148,"context_line":"                        argument is required.  If so, it must be specified in"},{"line_number":149,"context_line":"                        the clean request; false if it is optional."},{"line_number":150,"context_line":"    :raises InvalidParameterValue: if any of the arguments are invalid"},{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    def decorator(func):"},{"line_number":153,"context_line":"        func._is_clean_step \u003d True"},{"line_number":154,"context_line":"        if isinstance(priority, int):"},{"line_number":155,"context_line":"            func._clean_step_priority \u003d priority"},{"line_number":156,"context_line":"        else:"},{"line_number":157,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":158,"context_line":"                _(\u0027\"priority\" must be an integer value instead of \"%s\"\u0027)"},{"line_number":159,"context_line":"                % priority)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        if isinstance(abortable, bool):"},{"line_number":162,"context_line":"            func._clean_step_abortable \u003d abortable"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":165,"context_line":"                _(\u0027\"abortable\" must be a Boolean value instead of \"%s\"\u0027)"},{"line_number":166,"context_line":"                % abortable)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        _validate_argsinfo(argsinfo)"},{"line_number":169,"context_line":"        func._clean_step_argsinfo \u003d argsinfo"},{"line_number":170,"context_line":"        return func"},{"line_number":171,"context_line":"    return decorator"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def deploy_step(priority, argsinfo\u003dNone):"},{"line_number":175,"context_line":"    \"\"\"Decorator for deployment steps."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    Only steps with priorities greater than 0 are used."},{"line_number":178,"context_line":"    These steps are ordered by priority from highest value to lowest"},{"line_number":179,"context_line":"    value. For steps with the same priority, they are ordered by driver"},{"line_number":180,"context_line":"    interface priority (see conductor.manager.DEPLOYING_INTERFACE_PRIORITY)."},{"line_number":181,"context_line":"    execute_deploy_step() will be called on each step."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    Decorated deploy steps must take as the only positional argument, a"},{"line_number":184,"context_line":"    TaskManager object."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    Deploy steps can be either synchronous or asynchronous.  If the step is"},{"line_number":187,"context_line":"    synchronous, it should return `None` when finished, and the conductor"},{"line_number":188,"context_line":"    will continue on to the next step. While the deploy step is executing, the"},{"line_number":189,"context_line":"    node will be in `states.DEPLOYING` provision state. If the step is"},{"line_number":190,"context_line":"    asynchronous, the step should return `states.DEPLOYWAIT` to the"},{"line_number":191,"context_line":"    conductor before it starts the asynchronous work.  When the step is"},{"line_number":192,"context_line":"    complete, the step should make an RPC call to `continue_node_deploy` to"},{"line_number":193,"context_line":"    move to the next step in deployment. The node will be in"},{"line_number":194,"context_line":"    `states.DEPLOYWAIT` provision state during the asynchronous work."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    Examples::"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        class MyInterface(base.BaseInterface):"},{"line_number":199,"context_line":"            @base.deploy_step(priority\u003d100)"},{"line_number":200,"context_line":"            def example_deploying(self, task):"},{"line_number":201,"context_line":"                # do some deploying"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    :param priority: an integer (\u003e\u003d0) priority; used for determining the order"},{"line_number":204,"context_line":"        in which the step is run in the deployment process."},{"line_number":205,"context_line":"    :param argsinfo: a dictionary of keyword arguments where key is the name of"},{"line_number":206,"context_line":"        the argument and value is a dictionary as follows::"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            \u0027description\u0027: \u003cdescription\u003e. Required. This should include"},{"line_number":209,"context_line":"                           possible values."},{"line_number":210,"context_line":"            \u0027required\u0027: Boolean. Optional; default is False. True if this"},{"line_number":211,"context_line":"                        argument is required.  If so, it must be specified in"},{"line_number":212,"context_line":"                        the deployment request; false if it is optional."},{"line_number":213,"context_line":"    :raises InvalidParameterValue: if any of the arguments are invalid"},{"line_number":214,"context_line":"    \"\"\""},{"line_number":215,"context_line":"    def decorator(func):"},{"line_number":216,"context_line":"        func._is_deploy_step \u003d True"},{"line_number":217,"context_line":"        if isinstance(priority, int) and priority \u003e\u003d 0:"},{"line_number":218,"context_line":"            func._deploy_step_priority \u003d priority"},{"line_number":219,"context_line":"        else:"},{"line_number":220,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":221,"context_line":"                _(\u0027\"priority\" must be an integer value \u003e\u003d 0, instead of \"%s\"\u0027)"},{"line_number":222,"context_line":"                % priority)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        _validate_argsinfo(argsinfo)"},{"line_number":225,"context_line":"        func._deploy_step_argsinfo \u003d argsinfo"},{"line_number":226,"context_line":"        return func"},{"line_number":227,"context_line":"    return decorator"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"class BareDriver(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_8438733d","line":227,"range":{"start_line":42,"start_character":0,"end_line":227,"end_character":20},"updated":"2019-03-08 12:10:44.000000000","message":"I wonder if this belongs in ironic.drivers.steps?","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"b67e13cefba5fb0ccbba98b2d5844b9567620a46","unresolved":false,"context_lines":[{"line_number":1167,"context_line":"                            delete_existing\u003dFalse):"},{"line_number":1168,"context_line":"        \"\"\"Applies RAID configuration on the given node."},{"line_number":1169,"context_line":""},{"line_number":1170,"context_line":"        :param interface: a RAIDInterface."},{"line_number":1171,"context_line":"        :param task: A TaskManager instance."},{"line_number":1172,"context_line":"        :param raid_config: The RAID configuration to apply."},{"line_number":1173,"context_line":"        :param create_root_volume: Setting this to False indicates"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_2a7660da","line":1170,"range":{"start_line":1170,"start_character":8,"end_line":1170,"end_character":42},"updated":"2019-05-08 09:58:08.000000000","message":"This can be removed.","commit_id":"d44d83f6976700cb20b68e7f419d126213f07d86"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2e5257e335b55e130bee3004d6aacccc6c656566","unresolved":false,"context_lines":[{"line_number":1167,"context_line":"                            delete_existing\u003dFalse):"},{"line_number":1168,"context_line":"        \"\"\"Applies RAID configuration on the given node."},{"line_number":1169,"context_line":""},{"line_number":1170,"context_line":"        :param interface: a RAIDInterface."},{"line_number":1171,"context_line":"        :param task: A TaskManager instance."},{"line_number":1172,"context_line":"        :param raid_config: The RAID configuration to apply."},{"line_number":1173,"context_line":"        :param create_root_volume: Setting this to False indicates"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_16905d95","line":1170,"range":{"start_line":1170,"start_character":8,"end_line":1170,"end_character":42},"in_reply_to":"dfbec78f_2a7660da","updated":"2019-08-02 11:09:26.000000000","message":"Done","commit_id":"d44d83f6976700cb20b68e7f419d126213f07d86"}],"ironic/drivers/modules/agent.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"b67e13cefba5fb0ccbba98b2d5844b9567620a46","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        elif task.driver.storage.should_write_image(task):"},{"line_number":466,"context_line":"            # Check if the driver has already performed a reboot in a previous"},{"line_number":467,"context_line":"            # deploy step."},{"line_number":468,"context_line":"            if not task.node.driver_internal_info.get(\u0027deployment_reboot\u0027,"},{"line_number":469,"context_line":"                                                      False):"},{"line_number":470,"context_line":"                manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":471,"context_line":"            info \u003d task.node.driver_internal_info"},{"line_number":472,"context_line":"            info.pop(\u0027deployment_reboot\u0027, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_316558e2","line":469,"range":{"start_line":468,"start_character":12,"end_line":469,"end_character":61},"updated":"2019-05-08 09:58:08.000000000","message":"If its already rebooted, it can get into path of fast_track and call continue_deploy() as in L463-L464. This is also ok I suppose, as it would get called after next heartbeat.","commit_id":"d44d83f6976700cb20b68e7f419d126213f07d86"}],"ironic/drivers/modules/drac/job.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                   for job in unfinished_jobs):"},{"line_number":46,"context_line":"            return"},{"line_number":47,"context_line":"    msg \u003d _(\u0027Unfinished config jobs found: %(jobs)r. Make sure they are \u0027"},{"line_number":48,"context_line":"            \u0027completed before retrying.\u0027) % {\u0027jobs\u0027: unfinished_jobs}"},{"line_number":49,"context_line":"    raise exception.DracOperationError(error\u003dmsg)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_285edf43","line":48,"updated":"2019-09-13 19:05:57.000000000","message":"probably doesn\u0027t matter, but if name_prefix is specified, this will list all the unfinished_jobs, not just the ones with name_prefix. For debugging, whatever, would it be useful to see only the name_prefix ones, or to spit out name_prefix value in the msg?","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                   for job in unfinished_jobs):"},{"line_number":46,"context_line":"            return"},{"line_number":47,"context_line":"    msg \u003d _(\u0027Unfinished config jobs found: %(jobs)r. Make sure they are \u0027"},{"line_number":48,"context_line":"            \u0027completed before retrying.\u0027) % {\u0027jobs\u0027: unfinished_jobs}"},{"line_number":49,"context_line":"    raise exception.DracOperationError(error\u003dmsg)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_a4e2a22e","line":48,"in_reply_to":"5faad753_285edf43","updated":"2019-09-16 16:38:06.000000000","message":"Good point.","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"7a3884d2362f93df80d05e24b92f4ef2a0b7adf4","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    unfinished_jobs \u003d list_unfinished_jobs(node)"},{"line_number":41,"context_line":"    if name_prefix is not None:"},{"line_number":42,"context_line":"        # Filter out jobs that don\u0027t match the name prefix."},{"line_number":43,"context_line":"        unfinished_jobs \u003d [job for job in unfinished_jobs"},{"line_number":44,"context_line":"                           if job.name.startswith(name_prefix)]"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_59bdcf66","line":41,"updated":"2019-09-16 21:39:00.000000000","message":"Thanks for this change Mark!  I\u0027ve been thinking about making this change myself recently, but you\u0027ve happily beaten me to it!","commit_id":"54a9604339255be48ff888543b0e56120bb045c3"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"8691ecdfcc791df14fd7ca5bab13bbf10b04198c","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    unfinished_jobs \u003d list_unfinished_jobs(node)"},{"line_number":41,"context_line":"    if name_prefix is not None:"},{"line_number":42,"context_line":"        # Filter out jobs that don\u0027t match the name prefix."},{"line_number":43,"context_line":"        unfinished_jobs \u003d [job for job in unfinished_jobs"},{"line_number":44,"context_line":"                           if job.name.startswith(name_prefix)]"},{"line_number":45,"context_line":"    if not unfinished_jobs:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_713be6d0","line":42,"updated":"2019-09-18 06:36:08.000000000","message":"According to the comment, the jobs which don\u0027t match the name_prefix are filtered. However, in the actual code L43, it\u0027s the opposite, the jobs matching the name_prefix is filtered.\nI think the comment needs to be updated.","commit_id":"be1e500031069a2ffe3b2c5b3d55fd98de90b0de"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"5e266209874de4a076b63b238e597ba52e7a0562","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    unfinished_jobs \u003d list_unfinished_jobs(node)"},{"line_number":41,"context_line":"    if name_prefix is not None:"},{"line_number":42,"context_line":"        # Filter out jobs that don\u0027t match the name prefix."},{"line_number":43,"context_line":"        unfinished_jobs \u003d [job for job in unfinished_jobs"},{"line_number":44,"context_line":"                           if job.name.startswith(name_prefix)]"},{"line_number":45,"context_line":"    if not unfinished_jobs:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_f77826f9","line":42,"in_reply_to":"3fa7e38b_713be6d0","updated":"2019-09-18 09:08:49.000000000","message":"Filter out normally means remove.","commit_id":"be1e500031069a2ffe3b2c5b3d55fd98de90b0de"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"418c33149573e533f2d9c8618e236dba16d4708d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    unfinished_jobs \u003d list_unfinished_jobs(node)"},{"line_number":41,"context_line":"    if name_prefix is not None:"},{"line_number":42,"context_line":"        # Filter out jobs that don\u0027t match the name prefix."},{"line_number":43,"context_line":"        unfinished_jobs \u003d [job for job in unfinished_jobs"},{"line_number":44,"context_line":"                           if job.name.startswith(name_prefix)]"},{"line_number":45,"context_line":"    if not unfinished_jobs:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_e20dc637","line":42,"in_reply_to":"3fa7e38b_f77826f9","updated":"2019-09-18 09:27:35.000000000","message":"Yes :( Sorry about that. I missed it.","commit_id":"be1e500031069a2ffe3b2c5b3d55fd98de90b0de"}],"ironic/drivers/modules/drac/raid.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"262a6b961dd970f494c7e36521fea677e202ede9","unresolved":false,"context_lines":[{"line_number":901,"context_line":"        task.node.last_error \u003d config_job.message"},{"line_number":902,"context_line":"        task.process_event(\u0027fail\u0027)"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"    def _resume(self, task):"},{"line_number":905,"context_line":"        raid_common.update_raid_info("},{"line_number":906,"context_line":"            task.node, self.get_logical_disks(task))"},{"line_number":907,"context_line":"        # Signal that the node has been rebooted."}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_489ab014","line":904,"updated":"2019-03-07 17:54:55.000000000","message":"hmm. i wonder if we will end up pulling this out of drac and using as a general mechanism to handle detection of a step being done...","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"681e7a5d5499efe87cb2d387905e7835f31b17d5","unresolved":false,"context_lines":[{"line_number":901,"context_line":"        task.node.last_error \u003d config_job.message"},{"line_number":902,"context_line":"        task.process_event(\u0027fail\u0027)"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"    def _resume(self, task):"},{"line_number":905,"context_line":"        raid_common.update_raid_info("},{"line_number":906,"context_line":"            task.node, self.get_logical_disks(task))"},{"line_number":907,"context_line":"        # Signal that the node has been rebooted."}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_44f5ab82","line":904,"in_reply_to":"5fc1f717_489ab014","updated":"2019-03-08 12:10:44.000000000","message":"With the exception of L905-6 it would be generally useful.","commit_id":"18f5b84ee24ee99a5fb2094a09f1da061981bb0b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2e83b66c0226afa548b0d86ce88a4cd7c57cfdc2","unresolved":false,"context_lines":[{"line_number":805,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":806,"context_line":"    node.save()"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    if node.clean_step:"},{"line_number":809,"context_line":"        return states.CLEANWAIT"},{"line_number":810,"context_line":"    else:"},{"line_number":811,"context_line":"        return states.DEPLOYWAIT"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"def _get_disk_free_size_mb(disk, pending_delete):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_d9d85153","line":811,"range":{"start_line":808,"start_character":0,"end_line":811,"end_character":32},"updated":"2019-08-15 17:34:52.000000000","message":"Feels like we\u0027re going to need some more helpers...","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8887edbef5e27ecdc1d6686ed074040270aba5df","unresolved":false,"context_lines":[{"line_number":805,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":806,"context_line":"    node.save()"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    if node.clean_step:"},{"line_number":809,"context_line":"        return states.CLEANWAIT"},{"line_number":810,"context_line":"    else:"},{"line_number":811,"context_line":"        return states.DEPLOYWAIT"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"def _get_disk_free_size_mb(disk, pending_delete):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_a962923c","line":811,"range":{"start_line":808,"start_character":0,"end_line":811,"end_character":32},"in_reply_to":"7faddb67_ac05d911","updated":"2019-08-21 10:48:37.000000000","message":"Done","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9206ebc7e18bbe32264b1b5757b41767d11d18a9","unresolved":false,"context_lines":[{"line_number":805,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":806,"context_line":"    node.save()"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    if node.clean_step:"},{"line_number":809,"context_line":"        return states.CLEANWAIT"},{"line_number":810,"context_line":"    else:"},{"line_number":811,"context_line":"        return states.DEPLOYWAIT"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"def _get_disk_free_size_mb(disk, pending_delete):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_ac05d911","line":811,"range":{"start_line":808,"start_character":0,"end_line":811,"end_character":32},"in_reply_to":"7faddb67_d9d85153","updated":"2019-08-20 08:53:54.000000000","message":"+1","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9206ebc7e18bbe32264b1b5757b41767d11d18a9","unresolved":false,"context_lines":[{"line_number":831,"context_line":"                      argsinfo\u003dbase.RAID_APPLY_CONFIGURATION_ARGSINFO)"},{"line_number":832,"context_line":"    def apply_configuration(self, task, raid_config, create_root_volume\u003dTrue,"},{"line_number":833,"context_line":"                            create_nonroot_volumes\u003dFalse,"},{"line_number":834,"context_line":"                            delete_existing\u003dFalse):"},{"line_number":835,"context_line":"        return super(DracRAID, self).apply_configuration("},{"line_number":836,"context_line":"            task, raid_config, create_root_volume, create_nonroot_volumes,"},{"line_number":837,"context_line":"            delete_existing)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_ecff51fe","line":834,"range":{"start_line":834,"start_character":44,"end_line":834,"end_character":49},"updated":"2019-08-20 08:53:54.000000000","message":"Default was changed to True.","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8887edbef5e27ecdc1d6686ed074040270aba5df","unresolved":false,"context_lines":[{"line_number":831,"context_line":"                      argsinfo\u003dbase.RAID_APPLY_CONFIGURATION_ARGSINFO)"},{"line_number":832,"context_line":"    def apply_configuration(self, task, raid_config, create_root_volume\u003dTrue,"},{"line_number":833,"context_line":"                            create_nonroot_volumes\u003dFalse,"},{"line_number":834,"context_line":"                            delete_existing\u003dFalse):"},{"line_number":835,"context_line":"        return super(DracRAID, self).apply_configuration("},{"line_number":836,"context_line":"            task, raid_config, create_root_volume, create_nonroot_volumes,"},{"line_number":837,"context_line":"            delete_existing)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_c9658e46","line":834,"range":{"start_line":834,"start_character":44,"end_line":834,"end_character":49},"in_reply_to":"7faddb67_ecff51fe","updated":"2019-08-21 10:48:37.000000000","message":"Done","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9206ebc7e18bbe32264b1b5757b41767d11d18a9","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"        raid_common.update_raid_info("},{"line_number":1127,"context_line":"            task.node, self.get_logical_disks(task))"},{"line_number":1128,"context_line":"        # Signal that the node has been rebooted."},{"line_number":1129,"context_line":"        flag_name \u003d (\u0027cleaning_reboot\u0027 if task.node.clean_step"},{"line_number":1130,"context_line":"                     else \u0027deployment_reboot\u0027)"},{"line_number":1131,"context_line":"        driver_internal_info \u003d task.node.driver_internal_info"},{"line_number":1132,"context_line":"        driver_internal_info[flag_name] \u003d True"},{"line_number":1133,"context_line":"        task.node.driver_internal_info \u003d driver_internal_info"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_6c3cc1c7","line":1130,"range":{"start_line":1129,"start_character":8,"end_line":1130,"end_character":46},"updated":"2019-08-20 08:53:54.000000000","message":"Helper here too?","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8887edbef5e27ecdc1d6686ed074040270aba5df","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"        raid_common.update_raid_info("},{"line_number":1127,"context_line":"            task.node, self.get_logical_disks(task))"},{"line_number":1128,"context_line":"        # Signal that the node has been rebooted."},{"line_number":1129,"context_line":"        flag_name \u003d (\u0027cleaning_reboot\u0027 if task.node.clean_step"},{"line_number":1130,"context_line":"                     else \u0027deployment_reboot\u0027)"},{"line_number":1131,"context_line":"        driver_internal_info \u003d task.node.driver_internal_info"},{"line_number":1132,"context_line":"        driver_internal_info[flag_name] \u003d True"},{"line_number":1133,"context_line":"        task.node.driver_internal_info \u003d driver_internal_info"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_c9982e1c","line":1130,"range":{"start_line":1129,"start_character":8,"end_line":1130,"end_character":46},"in_reply_to":"7faddb67_6c3cc1c7","updated":"2019-08-21 10:48:37.000000000","message":"Done","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9206ebc7e18bbe32264b1b5757b41767d11d18a9","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"        driver_internal_info[flag_name] \u003d True"},{"line_number":1133,"context_line":"        task.node.driver_internal_info \u003d driver_internal_info"},{"line_number":1134,"context_line":"        task.node.save()"},{"line_number":1135,"context_line":"        if task.node.clean_step:"},{"line_number":1136,"context_line":"            manager_utils.notify_conductor_resume_clean(task)"},{"line_number":1137,"context_line":"        else:"},{"line_number":1138,"context_line":"            manager_utils.notify_conductor_resume_deploy(task)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"    def _delete_configuration_no_commit(self, task):"},{"line_number":1141,"context_line":"        \"\"\"Delete existing RAID configuration without committing the change."}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_ec4d1172","line":1138,"range":{"start_line":1135,"start_character":0,"end_line":1138,"end_character":62},"updated":"2019-08-20 08:53:54.000000000","message":"And here?","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8887edbef5e27ecdc1d6686ed074040270aba5df","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"        driver_internal_info[flag_name] \u003d True"},{"line_number":1133,"context_line":"        task.node.driver_internal_info \u003d driver_internal_info"},{"line_number":1134,"context_line":"        task.node.save()"},{"line_number":1135,"context_line":"        if task.node.clean_step:"},{"line_number":1136,"context_line":"            manager_utils.notify_conductor_resume_clean(task)"},{"line_number":1137,"context_line":"        else:"},{"line_number":1138,"context_line":"            manager_utils.notify_conductor_resume_deploy(task)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"    def _delete_configuration_no_commit(self, task):"},{"line_number":1141,"context_line":"        \"\"\"Delete existing RAID configuration without committing the change."}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_699b3a16","line":1138,"range":{"start_line":1135,"start_character":0,"end_line":1138,"end_character":62},"in_reply_to":"7faddb67_ec4d1172","updated":"2019-08-21 10:48:37.000000000","message":"We do not have more instances of this. May be we can add later.","commit_id":"a62e254956a808deead4f07a46c19b68290aecf4"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"7af53afec67d3ec3c9de6a085cf02fcfa138d858","unresolved":false,"context_lines":[{"line_number":481,"context_line":""},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"def _find_configuration(logical_disks, physical_disks, pending_delete):"},{"line_number":484,"context_line":"    \"\"\"Find RAID configuration."},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    This method transforms the RAID configuration defined in Ironic to a format"},{"line_number":487,"context_line":"    that is required by dracclient. This includes matching the physical disks"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_2985b759","line":484,"updated":"2019-08-29 09:03:23.000000000","message":"The definition of the parameters is missing. Can you add them?","commit_id":"f9c6ce9488933964444b0e7dbf808542a49d6fda"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"64de5dc58d260f51449b16dacafa1c162da52048","unresolved":false,"context_lines":[{"line_number":481,"context_line":""},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"def _find_configuration(logical_disks, physical_disks, pending_delete):"},{"line_number":484,"context_line":"    \"\"\"Find RAID configuration."},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    This method transforms the RAID configuration defined in Ironic to a format"},{"line_number":487,"context_line":"    that is required by dracclient. This includes matching the physical disks"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_0050f35c","line":484,"in_reply_to":"7faddb67_2985b759","updated":"2019-09-10 14:31:43.000000000","message":"Done","commit_id":"f9c6ce9488933964444b0e7dbf808542a49d6fda"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":166,"context_line":"def _validate_job_queue(node, raid_controller\u003dNone):"},{"line_number":167,"context_line":"    \"\"\"Validate that there are no pending jobs for this controller."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    :param node: and ironic node object."},{"line_number":170,"context_line":"    :param raid_controller: Name of the RAID controller."},{"line_number":171,"context_line":"    \"\"\""},{"line_number":172,"context_line":"    kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_13e8f8df","line":169,"updated":"2019-09-13 19:05:57.000000000","message":"nit s/and/an/ ?","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":166,"context_line":"def _validate_job_queue(node, raid_controller\u003dNone):"},{"line_number":167,"context_line":"    \"\"\"Validate that there are no pending jobs for this controller."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    :param node: and ironic node object."},{"line_number":170,"context_line":"    :param raid_controller: Name of the RAID controller."},{"line_number":171,"context_line":"    \"\"\""},{"line_number":172,"context_line":"    kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_a45062d6","line":169,"in_reply_to":"5faad753_13e8f8df","updated":"2019-09-16 16:38:06.000000000","message":"Done","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    \"\"\"Validate that there are no pending jobs for this controller."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    :param node: and ironic node object."},{"line_number":170,"context_line":"    :param raid_controller: Name of the RAID controller."},{"line_number":171,"context_line":"    \"\"\""},{"line_number":172,"context_line":"    kwargs \u003d {}"},{"line_number":173,"context_line":"    if raid_controller:"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_4eb3230b","line":170,"updated":"2019-09-13 19:05:57.000000000","message":"I see that the description for this elsewhere is s/Name/id/ ?","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    \"\"\"Validate that there are no pending jobs for this controller."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    :param node: and ironic node object."},{"line_number":170,"context_line":"    :param raid_controller: Name of the RAID controller."},{"line_number":171,"context_line":"    \"\"\""},{"line_number":172,"context_line":"    kwargs \u003d {}"},{"line_number":173,"context_line":"    if raid_controller:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_045936fd","line":170,"in_reply_to":"5faad753_4eb3230b","updated":"2019-09-16 16:38:06.000000000","message":"Done","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":504,"context_line":"    missing properties."},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"    :param logical_disks: logical disk definitions."},{"line_number":507,"context_line":"    :param physical_disks: ids of the physical disks."},{"line_number":508,"context_line":"    :param pending_delete: Whether there is a pending deletion of virtual"},{"line_number":509,"context_line":"        disks that should be accounted for."},{"line_number":510,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_137f9815","line":507,"updated":"2019-09-13 19:05:57.000000000","message":"are the above two lists?","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":504,"context_line":"    missing properties."},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"    :param logical_disks: logical disk definitions."},{"line_number":507,"context_line":"    :param physical_disks: ids of the physical disks."},{"line_number":508,"context_line":"    :param pending_delete: Whether there is a pending deletion of virtual"},{"line_number":509,"context_line":"        disks that should be accounted for."},{"line_number":510,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_64326aaa","line":507,"in_reply_to":"5faad753_137f9815","updated":"2019-09-16 16:38:06.000000000","message":"Done","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":691,"context_line":"                for disk in disks"},{"line_number":692,"context_line":"            }"},{"line_number":693,"context_line":"            disks \u003d [disk for disk in disks"},{"line_number":694,"context_line":"                     if initial_free_size_mb[disk] \u003d\u003d free_space_mb[disk]]"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        max_spans \u003d _calculate_spans(raid_level, len(disks))"},{"line_number":697,"context_line":"        min_spans \u003d min([2, max_spans])"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_eebf6fa7","line":694,"updated":"2019-09-13 19:05:57.000000000","message":"I don\u0027t know if we need initial_free_size_mb.\n\ninitial_free_size_mb[disk]  is the same as _get_disk_free_size_mb(disk, pending_delete), right? Either is fine; just took me a bit to realize.\n\nI don\u0027t really understand this code (don\u0027t want to study it), so I guess this is right. free_space_mb dict was calculated using _get_disk_free_size_mb() so I don\u0027t know why this isn\u0027t always true, but maybe something changed between the time free_space_mb was created and now. And I see some recursion going on so... I\u0027ll assume the code is correct :)","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":691,"context_line":"                for disk in disks"},{"line_number":692,"context_line":"            }"},{"line_number":693,"context_line":"            disks \u003d [disk for disk in disks"},{"line_number":694,"context_line":"                     if initial_free_size_mb[disk] \u003d\u003d free_space_mb[disk]]"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        max_spans \u003d _calculate_spans(raid_level, len(disks))"},{"line_number":697,"context_line":"        min_spans \u003d min([2, max_spans])"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_e4f5fa84","line":694,"in_reply_to":"5faad753_eebf6fa7","updated":"2019-09-16 16:38:06.000000000","message":"I think I used a dict because calling the function in the list comprehension would push the expression over two lines and make it hard to read. I could change if you like.\n\nAs for what\u0027s going on here, free_space_mb tracks the current free space as the alorithm progresses, and we want to compare to the initial space to see if it is completely free.","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":772,"context_line":"    :param substep: contain sub cleaning or deploy step which executes any raid"},{"line_number":773,"context_line":"                    configuration job if set after cleaning or deploy step."},{"line_number":774,"context_line":"                    (default to completed)"},{"line_number":775,"context_line":"    :returns: states.CLEANWAIT if deletion is in progress asynchronously"},{"line_number":776,"context_line":"              or None if it is completed."},{"line_number":777,"context_line":"    \"\"\""},{"line_number":778,"context_line":"    if not controllers:"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_f3019c07","line":775,"updated":"2019-09-13 19:05:57.000000000","message":"or states.DEPLOYWAIT?\n\nI\u0027m not sure if this part is true for cleaning \u0027if deletion is in progress... etc.\u0027 but then, I didn\u0027t read this code.","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":772,"context_line":"    :param substep: contain sub cleaning or deploy step which executes any raid"},{"line_number":773,"context_line":"                    configuration job if set after cleaning or deploy step."},{"line_number":774,"context_line":"                    (default to completed)"},{"line_number":775,"context_line":"    :returns: states.CLEANWAIT if deletion is in progress asynchronously"},{"line_number":776,"context_line":"              or None if it is completed."},{"line_number":777,"context_line":"    \"\"\""},{"line_number":778,"context_line":"    if not controllers:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_248792da","line":775,"in_reply_to":"5faad753_f3019c07","updated":"2019-09-16 16:38:06.000000000","message":"Done","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":860,"context_line":"                            delete_existing\u003dTrue):"},{"line_number":861,"context_line":"        return super(DracRAID, self).apply_configuration("},{"line_number":862,"context_line":"            task, raid_config, create_root_volume, create_nonroot_volumes,"},{"line_number":863,"context_line":"            delete_existing)"},{"line_number":864,"context_line":""},{"line_number":865,"context_line":"    @METRICS.timer(\u0027DracRAID.create_configuration\u0027)"},{"line_number":866,"context_line":"    @base.clean_step(priority\u003d0, abortable\u003dFalse, argsinfo\u003d{"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_0e6bebb6","line":863,"updated":"2019-09-13 19:05:57.000000000","message":"nit, i\u0027d prefer \u0027create_root_volume\u003dcreate_root_volume, create_nonroot_volumes\u003dcreate_nonroot_volumes, delete_existing\u003ddelete_existing\u0027","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":860,"context_line":"                            delete_existing\u003dTrue):"},{"line_number":861,"context_line":"        return super(DracRAID, self).apply_configuration("},{"line_number":862,"context_line":"            task, raid_config, create_root_volume, create_nonroot_volumes,"},{"line_number":863,"context_line":"            delete_existing)"},{"line_number":864,"context_line":""},{"line_number":865,"context_line":"    @METRICS.timer(\u0027DracRAID.create_configuration\u0027)"},{"line_number":866,"context_line":"    @base.clean_step(priority\u003d0, abortable\u003dFalse, argsinfo\u003d{"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_847526fd","line":863,"in_reply_to":"5faad753_0e6bebb6","updated":"2019-09-16 16:38:06.000000000","message":"Done","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":887,"context_line":"            \"required\": False,"},{"line_number":888,"context_line":"        }"},{"line_number":889,"context_line":"    })"},{"line_number":890,"context_line":"    def create_configuration(self, task,"},{"line_number":891,"context_line":"                             create_root_volume\u003dTrue,"},{"line_number":892,"context_line":"                             create_nonroot_volumes\u003dTrue,"},{"line_number":893,"context_line":"                             delete_existing\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_ae3df78f","line":890,"updated":"2019-09-13 19:05:57.000000000","message":"so this is only a clean step, it can\u0027t be a deploy step? [I\u0027ve forgotten how it all works...]","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":887,"context_line":"            \"required\": False,"},{"line_number":888,"context_line":"        }"},{"line_number":889,"context_line":"    })"},{"line_number":890,"context_line":"    def create_configuration(self, task,"},{"line_number":891,"context_line":"                             create_root_volume\u003dTrue,"},{"line_number":892,"context_line":"                             create_nonroot_volumes\u003dTrue,"},{"line_number":893,"context_line":"                             delete_existing\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_2460f232","line":890,"in_reply_to":"5faad753_ae3df78f","updated":"2019-09-16 16:38:06.000000000","message":"Not really - it requires you to set the target config via an API call. What we might want to do is make cleaning easier to use by making apply_configuration a clean step too.","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"7a3884d2362f93df80d05e24b92f4ef2a0b7adf4","unresolved":false,"context_lines":[{"line_number":892,"context_line":"    def create_configuration(self, task,"},{"line_number":893,"context_line":"                             create_root_volume\u003dTrue,"},{"line_number":894,"context_line":"                             create_nonroot_volumes\u003dTrue,"},{"line_number":895,"context_line":"                             delete_existing\u003dTrue):"},{"line_number":896,"context_line":"        \"\"\"Create the RAID configuration."},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        This method creates the RAID configuration on the given node."}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_0b5cde49","line":895,"updated":"2019-09-16 21:39:00.000000000","message":"Defaulting delete_existing to True is a change that will potentially break scripts that are using the create_configuration cleaning step.  The scenario that I\u0027m thinking of is where create_configuration is called repeatedly creating a RAID volume each time.  I would be much more comfortable with this patch if delete_existing were defaulted to False.","commit_id":"54a9604339255be48ff888543b0e56120bb045c3"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"09c59e7f3551c76cf33081c4a1655eebad05e20c","unresolved":false,"context_lines":[{"line_number":892,"context_line":"    def create_configuration(self, task,"},{"line_number":893,"context_line":"                             create_root_volume\u003dTrue,"},{"line_number":894,"context_line":"                             create_nonroot_volumes\u003dTrue,"},{"line_number":895,"context_line":"                             delete_existing\u003dTrue):"},{"line_number":896,"context_line":"        \"\"\"Create the RAID configuration."},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        This method creates the RAID configuration on the given node."}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_5627d265","line":895,"in_reply_to":"3fa7e38b_0b5cde49","updated":"2019-09-17 09:42:16.000000000","message":"Makes sense.","commit_id":"54a9604339255be48ff888543b0e56120bb045c3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0fe7869d8dfe6842f46dd460c273a33556d3f51a","unresolved":false,"context_lines":[{"line_number":884,"context_line":"            \"description\": ("},{"line_number":885,"context_line":"                \"Setting this to \u0027True\u0027 indicates to delete existing RAID \""},{"line_number":886,"context_line":"                \"configuration prior to creating the new configuration. \""},{"line_number":887,"context_line":"                \"Default value is \u0027True\u0027.\""},{"line_number":888,"context_line":"            ),"},{"line_number":889,"context_line":"            \"required\": False,"},{"line_number":890,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_8b83df56","line":887,"updated":"2019-09-17 15:29:23.000000000","message":"s/True/False/","commit_id":"5137e3c19a5b56cf29188b05ffb76dba0ff2236d"}],"ironic/tests/unit/drivers/modules/drac/test_job.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d4ee7dfaef31ab2d30d254e7c209f2f49a1a803","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    def test_validate_job_queue_name_prefix(self, mock_get_drac_client):"},{"line_number":115,"context_line":"        mock_client \u003d mock.Mock()"},{"line_number":116,"context_line":"        mock_get_drac_client.return_value \u003d mock_client"},{"line_number":117,"context_line":"        mock_client.list_jobs.return_value \u003d []"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        drac_job.validate_job_queue(self.node, name_prefix\u003d\u0027Fake\u0027)"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_5306701e","line":117,"updated":"2019-09-13 19:05:57.000000000","message":"I think if this returned [self.job], it\u0027d be a more useful test. If it is empty, it doesn\u0027t matter if name_prefix is specified or not.","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"e617865c965dce3c1f8eb43393e068d22abe93b5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    def test_validate_job_queue_name_prefix(self, mock_get_drac_client):"},{"line_number":115,"context_line":"        mock_client \u003d mock.Mock()"},{"line_number":116,"context_line":"        mock_get_drac_client.return_value \u003d mock_client"},{"line_number":117,"context_line":"        mock_client.list_jobs.return_value \u003d []"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        drac_job.validate_job_queue(self.node, name_prefix\u003d\u0027Fake\u0027)"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_a4e06298","line":117,"in_reply_to":"5faad753_5306701e","updated":"2019-09-16 16:38:06.000000000","message":"Done","commit_id":"8a6d17625342212e9dd433755607a8e3af00ad15"}],"ironic/tests/unit/drivers/modules/drac/test_raid.py":[{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"f68a49d5bb1ee7f746846c6499fc0eaadc06c00d","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                task.node, raid_controller\u003d\u0027RAID.Integrated.1-1\u0027,"},{"line_number":854,"context_line":"                realtime\u003dTrue, reboot\u003dFalse)"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"            self.assertEqual(1, mock_commit_config.call_count)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"        self.assertEqual(states.DEPLOYWAIT, return_value)"},{"line_number":859,"context_line":"        self.node.refresh()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_0cc2a234","line":856,"updated":"2019-09-17 21:33:57.000000000","message":"nit: It looks like the above line is unnecessary since we\u0027re asserting commit_config is called once on line 852 above.","commit_id":"be1e500031069a2ffe3b2c5b3d55fd98de90b0de"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"5e266209874de4a076b63b238e597ba52e7a0562","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                task.node, raid_controller\u003d\u0027RAID.Integrated.1-1\u0027,"},{"line_number":854,"context_line":"                realtime\u003dTrue, reboot\u003dFalse)"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"            self.assertEqual(1, mock_commit_config.call_count)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"        self.assertEqual(states.DEPLOYWAIT, return_value)"},{"line_number":859,"context_line":"        self.node.refresh()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_77e67619","line":856,"in_reply_to":"3fa7e38b_0cc2a234","updated":"2019-09-18 09:08:49.000000000","message":"That\u0027s true, I\u0027ll follow up.","commit_id":"be1e500031069a2ffe3b2c5b3d55fd98de90b0de"}],"releasenotes/notes/add-deploy-steps-drac-raid-interface-7023c03a96996265.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0fe7869d8dfe6842f46dd460c273a33556d3f51a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"3fa7e38b_0bdccf72","line":7,"updated":"2019-09-17 15:29:23.000000000","message":"i wonder if we should add something about the new \u0027delete_existing\u0027 arg for the clean step create_configuration().\n\nBonus, it is documented at https://storage.bhs1.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_1e3/641731/21/check/openstack-tox-docs/1e30820/docs/admin/cleaning.html#raid-interface :)","commit_id":"5137e3c19a5b56cf29188b05ffb76dba0ff2236d"}]}
