)]}'
{"/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":"51fb0fd671fda7cb6c684f45f45d91802849fdb2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ruby Loo \u003crloo@oath.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-06-28 15:31:50 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Deploy steps Unabridged version"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I5feac3856cc4b87a850180b7fd0b3b9805f9225f"},{"line_number":10,"context_line":"Story: #1753128"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f7c97a3_c318a777","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":5},"updated":"2018-07-02 13:55:11.000000000","message":"I\u0027d remove the WIP, and lets land this after cutting the next ironic release.  I agree we could use more unit tests, and we should check third party CI jobs, but this looks really good.","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"}],"doc/source/admin/notifications.rst":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"5dd0345ad9f25dcb24786d3b273f25f72c8c52a3","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        \"ironic_object.data\":{"},{"line_number":365,"context_line":"            \"clean_step\": None,"},{"line_number":366,"context_line":"            \"console_enabled\": False,"},{"line_number":367,"context_line":"            \"created_at\": \"2016-01-26T20:41:03+00:00\","},{"line_number":368,"context_line":"            \"driver\": \"ipmi\","},{"line_number":369,"context_line":"            \"extra\": {},"},{"line_number":370,"context_line":"            \"inspection_finished_at\": None,"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5f7c97a3_99d1c059","line":367,"updated":"2018-07-03 20:21:02.000000000","message":"deploy_step?","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"5dd0345ad9f25dcb24786d3b273f25f72c8c52a3","unresolved":false,"context_lines":[{"line_number":445,"context_line":"        \"ironic_object.data\":{"},{"line_number":446,"context_line":"            \"clean_step\": None,"},{"line_number":447,"context_line":"            \"console_enabled\": True,"},{"line_number":448,"context_line":"            \"created_at\": \"2016-01-26T20:41:03+00:00\","},{"line_number":449,"context_line":"            \"driver\": \"ipmi\","},{"line_number":450,"context_line":"            \"extra\": {},"},{"line_number":451,"context_line":"            \"inspection_finished_at\": None,"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5f7c97a3_39c8aca6","line":448,"updated":"2018-07-03 20:21:02.000000000","message":"deploy_step?","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"}],"ironic/conductor/manager.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"5dd0345ad9f25dcb24786d3b273f25f72c8c52a3","unresolved":false,"context_lines":[{"line_number":865,"context_line":"        continues. This can also be used to resume deploying on take_over."},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        :param context: an admin context."},{"line_number":868,"context_line":"        :param node_id: the ID or IDid of a node."},{"line_number":869,"context_line":"        :raises: InvalidStateRequested if the node is not in DEPLOYWAIT state"},{"line_number":870,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":871,"context_line":"                 async task"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_79d94426","line":868,"updated":"2018-07-03 20:21:02.000000000","message":"s/IDid/UUID/","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"737028fbe1457b9b4ca1e8d0a45a6c3ac8305b39","unresolved":false,"context_lines":[{"line_number":865,"context_line":"        continues. This can also be used to resume deploying on take_over."},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        :param context: an admin context."},{"line_number":868,"context_line":"        :param node_id: the ID or IDid of a node."},{"line_number":869,"context_line":"        :raises: InvalidStateRequested if the node is not in DEPLOYWAIT state"},{"line_number":870,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":871,"context_line":"                 async task"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_8f9832cc","line":868,"in_reply_to":"5f7c97a3_79d94426","updated":"2018-07-06 15:40:57.000000000","message":"Done","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51fb0fd671fda7cb6c684f45f45d91802849fdb2","unresolved":false,"context_lines":[{"line_number":883,"context_line":"            # to finish the deployment. Once we split up the deployment"},{"line_number":884,"context_line":"            # into separate deploy steps, we should be able to check for"},{"line_number":885,"context_line":"            # DEPLOYWAIT only."},{"line_number":886,"context_line":"            expected_states \u003d [states.DEPLOYWAIT, states.DEPLOYING]"},{"line_number":887,"context_line":"            if node.provision_state not in expected_states:"},{"line_number":888,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":889,"context_line":"                    \u0027Cannot continue deploying on %(node)s. Node is in \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_8872ccaf","line":886,"updated":"2018-07-02 13:55:11.000000000","message":"I suspect this would be needed to cross a rolling upgrade boundary as well.","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"737028fbe1457b9b4ca1e8d0a45a6c3ac8305b39","unresolved":false,"context_lines":[{"line_number":883,"context_line":"            # to finish the deployment. Once we split up the deployment"},{"line_number":884,"context_line":"            # into separate deploy steps, we should be able to check for"},{"line_number":885,"context_line":"            # DEPLOYWAIT only."},{"line_number":886,"context_line":"            expected_states \u003d [states.DEPLOYWAIT, states.DEPLOYING]"},{"line_number":887,"context_line":"            if node.provision_state not in expected_states:"},{"line_number":888,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":889,"context_line":"                    \u0027Cannot continue deploying on %(node)s. Node is in \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_4f9e9ab7","line":886,"in_reply_to":"5f7c97a3_8872ccaf","updated":"2018-07-06 15:40:57.000000000","message":"Good point; added.","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51fb0fd671fda7cb6c684f45f45d91802849fdb2","unresolved":false,"context_lines":[{"line_number":3505,"context_line":"                traceback\u003dTrue, clean_up\u003dFalse)"},{"line_number":3506,"context_line":""},{"line_number":3507,"context_line":"    try:"},{"line_number":3508,"context_line":"        utils.set_node_deployment_steps(task)"},{"line_number":3509,"context_line":"    except exception.InstanceDeployFailure as e:"},{"line_number":3510,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":3511,"context_line":"            utils.deploying_error_handler("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a889c825","line":3508,"updated":"2018-07-02 13:55:11.000000000","message":"Would be good to have an in-line note, FWIW.","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"737028fbe1457b9b4ca1e8d0a45a6c3ac8305b39","unresolved":false,"context_lines":[{"line_number":3505,"context_line":"                traceback\u003dTrue, clean_up\u003dFalse)"},{"line_number":3506,"context_line":""},{"line_number":3507,"context_line":"    try:"},{"line_number":3508,"context_line":"        utils.set_node_deployment_steps(task)"},{"line_number":3509,"context_line":"    except exception.InstanceDeployFailure as e:"},{"line_number":3510,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":3511,"context_line":"            utils.deploying_error_handler("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_4f69babd","line":3508,"in_reply_to":"5f7c97a3_a889c825","updated":"2018-07-06 15:40:57.000000000","message":"I added something; let me know if that is what you meant/wanted.","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51fb0fd671fda7cb6c684f45f45d91802849fdb2","unresolved":false,"context_lines":[{"line_number":3521,"context_line":"        # one deploy step. If none, the deployment fails."},{"line_number":3522,"context_line":"        #"},{"line_number":3523,"context_line":"        # out-of-tree driver that hasn\u0027t yet converted to using deploy steps"},{"line_number":3524,"context_line":"        # so go back to old way."},{"line_number":3525,"context_line":"        _old_rest_of_do_node_deploy(task, conductor_id)"},{"line_number":3526,"context_line":"    else:"},{"line_number":3527,"context_line":"        _do_next_deploy_step(task, 0, conductor_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_88864c16","line":3524,"updated":"2018-07-02 13:55:11.000000000","message":"I have mixed feelings on this, I think the consensus was 2 cycles to give out of tree deploy drivers time, although I think we can only deprecate once we fix the ansible deploy driver.","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"737028fbe1457b9b4ca1e8d0a45a6c3ac8305b39","unresolved":false,"context_lines":[{"line_number":3521,"context_line":"        # one deploy step. If none, the deployment fails."},{"line_number":3522,"context_line":"        #"},{"line_number":3523,"context_line":"        # out-of-tree driver that hasn\u0027t yet converted to using deploy steps"},{"line_number":3524,"context_line":"        # so go back to old way."},{"line_number":3525,"context_line":"        _old_rest_of_do_node_deploy(task, conductor_id)"},{"line_number":3526,"context_line":"    else:"},{"line_number":3527,"context_line":"        _do_next_deploy_step(task, 0, conductor_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_cf5cea1b","line":3524,"in_reply_to":"5f7c97a3_88864c16","updated":"2018-07-06 15:40:57.000000000","message":"I don\u0027t recall discussing it, but I\u0027m fine with whatever. I added a note in our subteam status/whiteboard, to decide on this.\n\nWhat do we need to fix wrt the ansible deploy driver?","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51fb0fd671fda7cb6c684f45f45d91802849fdb2","unresolved":false,"context_lines":[{"line_number":3523,"context_line":"        # out-of-tree driver that hasn\u0027t yet converted to using deploy steps"},{"line_number":3524,"context_line":"        # so go back to old way."},{"line_number":3525,"context_line":"        _old_rest_of_do_node_deploy(task, conductor_id)"},{"line_number":3526,"context_line":"    else:"},{"line_number":3527,"context_line":"        _do_next_deploy_step(task, 0, conductor_id)"},{"line_number":3528,"context_line":""},{"line_number":3529,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_48b27408","line":3526,"updated":"2018-07-02 13:55:11.000000000","message":"*blink* *blink*  Makes sense this would change as much as it has.","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69242672df97d22aa7cf356418fba230ee3038c1","unresolved":false,"context_lines":[{"line_number":3444,"context_line":"    if not steps:"},{"line_number":3445,"context_line":"        # TODO(rloo): This if.. can be deleted after some deprecation period."},{"line_number":3446,"context_line":"        # Note that after the deprecation period, there needs to be at least"},{"line_number":3447,"context_line":"        # one deploy step. If none, the deployment fails."},{"line_number":3448,"context_line":""},{"line_number":3449,"context_line":"        # out-of-tree driver that hasn\u0027t yet converted to using deploy steps"},{"line_number":3450,"context_line":"        # so go back to old way."}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_12096bda","line":3447,"updated":"2018-07-10 19:54:13.000000000","message":"NB: I think we are going to need to get deploy steps in eventually.","commit_id":"9a81724f3ba6710ae736652da4808722050f6d07"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# NOTE(rloo) This list is used to keep track of deprecation warnings that"},{"line_number":93,"context_line":"# have already been issued for deploy drivers that do not use deploy steps."},{"line_number":94,"context_line":"_SEEN_NO_DEPLOY_STEP_DEPRECATIONS \u003d []"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class ConductorManager(base_manager.BaseConductorManager):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_3eb404d4","line":94,"updated":"2018-07-16 08:38:25.000000000","message":"nit: set() feels more organic here","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# NOTE(rloo) This list is used to keep track of deprecation warnings that"},{"line_number":93,"context_line":"# have already been issued for deploy drivers that do not use deploy steps."},{"line_number":94,"context_line":"_SEEN_NO_DEPLOY_STEP_DEPRECATIONS \u003d []"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class ConductorManager(base_manager.BaseConductorManager):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_d5092a84","line":94,"in_reply_to":"5f7c97a3_3eb404d4","updated":"2018-07-16 20:33:23.000000000","message":"I did a copy/paste from above. But if it does make more sense, then we should change to a set (to prevent future copy/pastes :D)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"                                  include it."},{"line_number":1001,"context_line":"        :returns: index of the next step; None if there are none to execute."},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"        \"\"\""},{"line_number":1004,"context_line":"        node \u003d task.node"},{"line_number":1005,"context_line":"        if not getattr(node, \u0027%s_step\u0027 % step_type):"},{"line_number":1006,"context_line":"            # first time through, all steps need to be done. Return the"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_5eb780d8","line":1003,"updated":"2018-07-16 08:38:25.000000000","message":"nit: sanity-check step_type?","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"                                  include it."},{"line_number":1001,"context_line":"        :returns: index of the next step; None if there are none to execute."},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"        \"\"\""},{"line_number":1004,"context_line":"        node \u003d task.node"},{"line_number":1005,"context_line":"        if not getattr(node, \u0027%s_step\u0027 % step_type):"},{"line_number":1006,"context_line":"            # first time through, all steps need to be done. Return the"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_b87fc3ba","line":1003,"in_reply_to":"5f7c97a3_5eb780d8","updated":"2018-07-16 20:33:23.000000000","message":"That would be a coding error so it should just crap out? Well, I suppose it\u0027ll help the developer debug...","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":3488,"context_line":"    #             for supporting drivers with no deploy steps."},{"line_number":3489,"context_line":""},{"line_number":3490,"context_line":"    if no_deploy_steps:"},{"line_number":3491,"context_line":"        global _SEEN_NO_DEPLOY_STEP_DEPRECATIONS"},{"line_number":3492,"context_line":"        deploy_driver_name \u003d task.driver.deploy.__class__.__name__"},{"line_number":3493,"context_line":"        if deploy_driver_name not in _SEEN_NO_DEPLOY_STEP_DEPRECATIONS:"},{"line_number":3494,"context_line":"            LOG.warning(\u0027Deploy driver %s does not support deploy steps; this \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_fead2c84","line":3491,"updated":"2018-07-16 08:38:25.000000000","message":"nit: not needed, you don\u0027t assign to this variable","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":3488,"context_line":"    #             for supporting drivers with no deploy steps."},{"line_number":3489,"context_line":""},{"line_number":3490,"context_line":"    if no_deploy_steps:"},{"line_number":3491,"context_line":"        global _SEEN_NO_DEPLOY_STEP_DEPRECATIONS"},{"line_number":3492,"context_line":"        deploy_driver_name \u003d task.driver.deploy.__class__.__name__"},{"line_number":3493,"context_line":"        if deploy_driver_name not in _SEEN_NO_DEPLOY_STEP_DEPRECATIONS:"},{"line_number":3494,"context_line":"            LOG.warning(\u0027Deploy driver %s does not support deploy steps; this \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_95517266","line":3491,"in_reply_to":"5f7c97a3_fead2c84","updated":"2018-07-16 20:33:23.000000000","message":"+1 blame it on copy/paste :)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":3605,"context_line":"                     {\u0027node\u0027: node.uuid, \u0027step\u0027: step})"},{"line_number":3606,"context_line":"            task.process_event(\u0027wait\u0027)"},{"line_number":3607,"context_line":"            return"},{"line_number":3608,"context_line":"        elif result is not None:"},{"line_number":3609,"context_line":"            # NOTE(rloo): This is an internal/dev error; shouldn\u0027t happen."},{"line_number":3610,"context_line":"            log_msg \u003d (_(\u0027While executing deploy step %(step)s on node \u0027"},{"line_number":3611,"context_line":"                       \u0027%(node)s, step returned unexpected state: %(val)s\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_1eb108e1","line":3608,"updated":"2018-07-16 08:38:25.000000000","message":"nit: we may want to accept DEPLOYDONE just for convenience","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":3605,"context_line":"                     {\u0027node\u0027: node.uuid, \u0027step\u0027: step})"},{"line_number":3606,"context_line":"            task.process_event(\u0027wait\u0027)"},{"line_number":3607,"context_line":"            return"},{"line_number":3608,"context_line":"        elif result is not None:"},{"line_number":3609,"context_line":"            # NOTE(rloo): This is an internal/dev error; shouldn\u0027t happen."},{"line_number":3610,"context_line":"            log_msg \u003d (_(\u0027While executing deploy step %(step)s on node \u0027"},{"line_number":3611,"context_line":"                       \u0027%(node)s, step returned unexpected state: %(val)s\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_d5b36a99","line":3608,"in_reply_to":"5f7c97a3_1eb108e1","updated":"2018-07-16 20:33:23.000000000","message":"We could... I modelled this after cleaning, which btw has no CLEANDONE. I was actually thinking that maybe we could get rid of DEPLOYDONE in the future.\n\nFor now, if you\u0027re OK, let\u0027s leave it as is. We could add DEPLOYDONE later if we need to. I think that not adding it, makes it easier to debug/find code that isn\u0027t using deploy steps (cuz they should be the only ones returning DEPLOYDONE).","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"}],"ironic/conductor/utils.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"5dd0345ad9f25dcb24786d3b273f25f72c8c52a3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"DEPLOYING_INTERFACE_PRIORITY \u003d {"},{"line_number":46,"context_line":"    # When two deploy steps have the same priority, their order is determined"},{"line_number":47,"context_line":"    # by which interface is implementing the step. The step of the interface"},{"line_number":48,"context_line":"    # with the highest value here, will be executed first in that case."},{"line_number":49,"context_line":"    \u0027power\u0027: 4,"},{"line_number":50,"context_line":"    \u0027management\u0027: 3,"},{"line_number":51,"context_line":"    \u0027deploy\u0027: 2,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3942ec69","line":48,"updated":"2018-07-03 20:21:02.000000000","message":"Add bios?","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    # with the highest value here, will be executed first in that case."},{"line_number":49,"context_line":"    # TODO(rloo): If we think it makes sense to have the interface priorities"},{"line_number":50,"context_line":"    # the same for cleaning \u0026 deploying, replace the two with one e.g."},{"line_number":51,"context_line":"    # \u0027INTERFACE_PRIORITIES\u0027."},{"line_number":52,"context_line":"    \u0027power\u0027: 5,"},{"line_number":53,"context_line":"    \u0027management\u0027: 4,"},{"line_number":54,"context_line":"    \u0027deploy\u0027: 3,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_be9ed452","line":51,"updated":"2018-07-16 08:38:25.000000000","message":"++","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    # with the highest value here, will be executed first in that case."},{"line_number":49,"context_line":"    # TODO(rloo): If we think it makes sense to have the interface priorities"},{"line_number":50,"context_line":"    # the same for cleaning \u0026 deploying, replace the two with one e.g."},{"line_number":51,"context_line":"    # \u0027INTERFACE_PRIORITIES\u0027."},{"line_number":52,"context_line":"    \u0027power\u0027: 5,"},{"line_number":53,"context_line":"    \u0027management\u0027: 4,"},{"line_number":54,"context_line":"    \u0027deploy\u0027: 3,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_955bb253","line":51,"in_reply_to":"5f7c97a3_be9ed452","updated":"2018-07-16 20:33:23.000000000","message":"I think it\u0027ll be more obvious once we add some deploy steps, but I tend to agree. Besides this is only used as a tie breaker. Anyway, let\u0027s see what happens in the future :)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                addl \u003d _(\u0027An unhandled exception was encountered while \u0027"},{"line_number":467,"context_line":"                         \u0027aborting. More information may be found in the log \u0027"},{"line_number":468,"context_line":"                         \u0027file.\u0027)"},{"line_number":469,"context_line":"            cleanup_err \u003d _(\u0027%(err)s. %(add)s\u0027) % {\u0027err\u0027: errmsg, \u0027add\u0027: addl}"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    node.refresh()"},{"line_number":472,"context_line":"    if node.provision_state in ("}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_de99506b","line":469,"updated":"2018-07-16 08:38:25.000000000","message":"nit: it does not make much sense to translate this message","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                addl \u003d _(\u0027An unhandled exception was encountered while \u0027"},{"line_number":467,"context_line":"                         \u0027aborting. More information may be found in the log \u0027"},{"line_number":468,"context_line":"                         \u0027file.\u0027)"},{"line_number":469,"context_line":"            cleanup_err \u003d _(\u0027%(err)s. %(add)s\u0027) % {\u0027err\u0027: errmsg, \u0027add\u0027: addl}"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    node.refresh()"},{"line_number":472,"context_line":"    if node.provision_state in ("}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_d8e2bfd4","line":469,"in_reply_to":"5f7c97a3_de99506b","updated":"2018-07-16 20:33:23.000000000","message":"Good catch.","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"7a82756fd239db1a5c2848f814dad833de47c54e","unresolved":false,"context_lines":[{"line_number":688,"context_line":"    \"\"\""},{"line_number":689,"context_line":"    sort_key \u003d None"},{"line_number":690,"context_line":"    if sort:"},{"line_number":691,"context_line":"        sort_key \u003d _clean_step_key"},{"line_number":692,"context_line":"    return _get_steps(task, CLEANING_INTERFACE_PRIORITY, \u0027get_clean_steps\u0027,"},{"line_number":693,"context_line":"                      enabled\u003denabled, sort_step_key\u003dsort_key)"},{"line_number":694,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_eec6f54a","line":691,"updated":"2018-07-13 20:48:25.000000000","message":"nit - this could be a one liner.\n\nsort_key \u003d _clean_step_key if sort else None","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":688,"context_line":"    \"\"\""},{"line_number":689,"context_line":"    sort_key \u003d None"},{"line_number":690,"context_line":"    if sort:"},{"line_number":691,"context_line":"        sort_key \u003d _clean_step_key"},{"line_number":692,"context_line":"    return _get_steps(task, CLEANING_INTERFACE_PRIORITY, \u0027get_clean_steps\u0027,"},{"line_number":693,"context_line":"                      enabled\u003denabled, sort_step_key\u003dsort_key)"},{"line_number":694,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_d8fb9f78","line":691,"in_reply_to":"5f7c97a3_eec6f54a","updated":"2018-07-16 20:33:23.000000000","message":"+1","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"7a82756fd239db1a5c2848f814dad833de47c54e","unresolved":false,"context_lines":[{"line_number":708,"context_line":"    \"\"\""},{"line_number":709,"context_line":"    sort_key \u003d None"},{"line_number":710,"context_line":"    if sort:"},{"line_number":711,"context_line":"        sort_key \u003d _deploy_step_key"},{"line_number":712,"context_line":"    return _get_steps(task, DEPLOYING_INTERFACE_PRIORITY, \u0027get_deploy_steps\u0027,"},{"line_number":713,"context_line":"                      enabled\u003denabled, sort_step_key\u003dsort_key)"},{"line_number":714,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_aed55de8","line":711,"updated":"2018-07-13 20:48:25.000000000","message":"nit - same here","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"}],"ironic/drivers/modules/ansible/deploy.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        _run_playbook(node, playbook, extra_vars, key)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    @METRICS.timer(\u0027AnsibleDeploy.deploy\u0027)"},{"line_number":431,"context_line":"    @base.deploy_step(priority\u003d100)"},{"line_number":432,"context_line":"    @task_manager.require_exclusive_lock"},{"line_number":433,"context_line":"    def deploy(self, task):"},{"line_number":434,"context_line":"        \"\"\"Perform a deployment to a node.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_1e982867","line":431,"updated":"2018-07-16 08:38:25.000000000","message":"I wonder if it makes sense to make 100 a constant, since we\u0027re repeating it everywhere","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        _run_playbook(node, playbook, extra_vars, key)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    @METRICS.timer(\u0027AnsibleDeploy.deploy\u0027)"},{"line_number":431,"context_line":"    @base.deploy_step(priority\u003d100)"},{"line_number":432,"context_line":"    @task_manager.require_exclusive_lock"},{"line_number":433,"context_line":"    def deploy(self, task):"},{"line_number":434,"context_line":"        \"\"\"Perform a deployment to a node.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_43a80077","line":431,"in_reply_to":"5f7c97a3_1e982867","updated":"2018-07-16 20:33:23.000000000","message":"Makes sense. Although I am not sure what to call it; if we incorrectly name it, we\u0027ll want to rename it. After we split up the deploy step into two (or more), we\u0027re going to have to decide which ones are MUSTs, and decide on the priorities for them.\n\nPRIORITY_DEPLOY_START?\nPRIORITY_DEPLOY_MAIN?\nDEPLOY_START_PRIORITY?\n\nMaybe I\u0027ll leave this for later/someone else...","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"}],"ironic/drivers/modules/fake.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51fb0fd671fda7cb6c684f45f45d91802849fdb2","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def validate(self, task):"},{"line_number":96,"context_line":"        pass"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @base.deploy_step(priority\u003d100)"},{"line_number":99,"context_line":"    def deploy(self, task):"},{"line_number":100,"context_line":"        return None"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_c84be4ae","line":98,"updated":"2018-07-02 13:55:11.000000000","message":"nice!","commit_id":"7e980567b9cfa8e249b4a4fcc7bf44af8a6f5f7e"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":1343,"context_line":"        mock_iwdi.return_value \u003d True"},{"line_number":1344,"context_line":"        self._start_service()"},{"line_number":1345,"context_line":"        with mock.patch.object(fake.FakeDeploy,"},{"line_number":1346,"context_line":"                               \u0027deploy\u0027, autospec\u003dTrue) as mock_deploy:"},{"line_number":1347,"context_line":"            mock_deploy.return_value \u003d states.DEPLOYING"},{"line_number":1348,"context_line":"            node \u003d obj_utils.create_test_node("},{"line_number":1349,"context_line":"                self.context, driver\u003d\u0027fake-hardware\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_bec7b446","line":1346,"updated":"2018-07-16 08:38:25.000000000","message":"nit: convert mock to a decorator (ditto below)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"                               \u0027deploy\u0027, autospec\u003dTrue) as mock_deploy:"},{"line_number":1347,"context_line":"            mock_deploy.return_value \u003d states.DEPLOYING"},{"line_number":1348,"context_line":"            node \u003d obj_utils.create_test_node("},{"line_number":1349,"context_line":"                self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":1350,"context_line":"                provision_state\u003dstates.ACTIVE,"},{"line_number":1351,"context_line":"                target_provision_state\u003dstates.NOSTATE,"},{"line_number":1352,"context_line":"                instance_info\u003d{\u0027image_source\u0027: uuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_dec2b035","line":1349,"updated":"2018-07-16 08:38:25.000000000","message":"nit: driver\u003d\u0027fake-hardware\u0027 is the default","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"                               \u0027deploy\u0027, autospec\u003dTrue) as mock_deploy:"},{"line_number":1347,"context_line":"            mock_deploy.return_value \u003d states.DEPLOYING"},{"line_number":1348,"context_line":"            node \u003d obj_utils.create_test_node("},{"line_number":1349,"context_line":"                self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":1350,"context_line":"                provision_state\u003dstates.ACTIVE,"},{"line_number":1351,"context_line":"                target_provision_state\u003dstates.NOSTATE,"},{"line_number":1352,"context_line":"                instance_info\u003d{\u0027image_source\u0027: uuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_83adb833","line":1349,"in_reply_to":"5f7c97a3_dec2b035","updated":"2018-07-16 20:33:23.000000000","message":"yeah, it is all over though. Did you want us to delete it cuz it is the default? If so, we should do it throughout (where it makes sense of course).","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":1527,"context_line":"            \u0027step\u0027: \u0027deploy_end\u0027, \u0027priority\u0027: 20, \u0027interface\u0027: \u0027deploy\u0027}"},{"line_number":1528,"context_line":"        self.deploy_steps \u003d [self.deploy_start, self.deploy_end]"},{"line_number":1529,"context_line":""},{"line_number":1530,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.ConductorManager._spawn_worker\u0027)"},{"line_number":1531,"context_line":"    def test_continue_node_deploy_worker_pool_full(self, mock_spawn):"},{"line_number":1532,"context_line":"        # Test the appropriate exception is raised if the worker pool is full"},{"line_number":1533,"context_line":"        prv_state \u003d states.DEPLOYWAIT"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_7ec11c2f","line":1530,"updated":"2018-07-16 08:38:25.000000000","message":"nit: autospec\u003dTrue? (ditto below)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":1532,"context_line":"        # Test the appropriate exception is raised if the worker pool is full"},{"line_number":1533,"context_line":"        prv_state \u003d states.DEPLOYWAIT"},{"line_number":1534,"context_line":"        tgt_prv_state \u003d states.ACTIVE"},{"line_number":1535,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":1536,"context_line":"                                          provision_state\u003dprv_state,"},{"line_number":1537,"context_line":"                                          target_provision_state\u003dtgt_prv_state,"},{"line_number":1538,"context_line":"                                          last_error\u003dNone)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_9ebc38b6","line":1535,"updated":"2018-07-16 08:38:25.000000000","message":"nit: driver\u003d\u0027fake-harware\u0027 is the default","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":1943,"context_line":"        mock_deploy.assert_called_once_with(mock.ANY)"},{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"    def test__do_node_deploy_ok_2(self):"},{"line_number":1946,"context_line":"        # NOTE(rloo): a different way of testing for the same thing as in"},{"line_number":1947,"context_line":"        # test__do_node_deploy_ok()"},{"line_number":1948,"context_line":"        self._start_service()"},{"line_number":1949,"context_line":"        with mock.patch.object(fake.FakeDeploy,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_3ed96427","line":1946,"updated":"2018-07-16 08:38:25.000000000","message":"nit: different - how? I\u0027m pretty sure we\u0027ll forget after a year","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":1943,"context_line":"        mock_deploy.assert_called_once_with(mock.ANY)"},{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"    def test__do_node_deploy_ok_2(self):"},{"line_number":1946,"context_line":"        # NOTE(rloo): a different way of testing for the same thing as in"},{"line_number":1947,"context_line":"        # test__do_node_deploy_ok()"},{"line_number":1948,"context_line":"        self._start_service()"},{"line_number":1949,"context_line":"        with mock.patch.object(fake.FakeDeploy,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_782046b2","line":1946,"in_reply_to":"5f7c97a3_3ed96427","updated":"2018-07-16 20:33:23.000000000","message":"I copied that from the original test__do_node_deploy_ok_2().\n\nAnd yes, I forgot I had even written the original test. Will update it :)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":2049,"context_line":"    def test__old_rest_of_do_node_deploy_no_steps(self, mock_deploy, mock_log):"},{"line_number":2050,"context_line":"        # TODO(rloo): no deploy steps; delete this when we remove support"},{"line_number":2051,"context_line":"        # for handling no deploy steps."},{"line_number":2052,"context_line":"        manager._SEEN_NO_DEPLOY_STEP_DEPRECATIONS \u003d []"},{"line_number":2053,"context_line":"        self._start_service()"},{"line_number":2054,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake-hardware\u0027)"},{"line_number":2055,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_5edc6016","line":2052,"updated":"2018-07-16 08:38:25.000000000","message":"nit: we may use mock.patch for this","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":2166,"context_line":"        mock_execute.assert_called_once_with(mock.ANY, task,"},{"line_number":2167,"context_line":"                                             self.deploy_steps[1])"},{"line_number":2168,"context_line":""},{"line_number":2169,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_deploy_step\u0027)"},{"line_number":2170,"context_line":"    def test__do_next_deploy_step_last_step_done(self, mock_execute):"},{"line_number":2171,"context_line":"        # Resume where last_step is the last deploy step that was executed"},{"line_number":2172,"context_line":"        driver_internal_info \u003d {\u0027deploy_step_index\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_fee20cd4","line":2169,"updated":"2018-07-16 08:38:25.000000000","message":"autospec\u003dTrue (ditto below)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        self.assertNotIn(\u0027deploy_step_index\u0027, node.driver_internal_info)"},{"line_number":2219,"context_line":"        self.assertIsNone(node.driver_internal_info[\u0027deploy_steps\u0027])"},{"line_number":2220,"context_line":"        mock_execute.assert_has_calls \u003d [mock.call(self.deploy_steps[0]),"},{"line_number":2221,"context_line":"                                         mock.call(self.deploy_steps[1])]"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"    @mock.patch.object(conductor_utils, \u0027LOG\u0027, autospec\u003dTrue)"},{"line_number":2224,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_deploy_step\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_1ee6e8e8","line":2221,"updated":"2018-07-16 08:38:25.000000000","message":"mmm, does it work this way? or did you mean to call assert_has_calls?","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        self.assertNotIn(\u0027deploy_step_index\u0027, node.driver_internal_info)"},{"line_number":2219,"context_line":"        self.assertIsNone(node.driver_internal_info[\u0027deploy_steps\u0027])"},{"line_number":2220,"context_line":"        mock_execute.assert_has_calls \u003d [mock.call(self.deploy_steps[0]),"},{"line_number":2221,"context_line":"                                         mock.call(self.deploy_steps[1])]"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"    @mock.patch.object(conductor_utils, \u0027LOG\u0027, autospec\u003dTrue)"},{"line_number":2224,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_deploy_step\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_7b65a0e1","line":2221,"in_reply_to":"5f7c97a3_1ee6e8e8","updated":"2018-07-16 20:33:23.000000000","message":"I\u0027m not sure what you mean here. I wanted to check that the execute_deploy_step() method was called twice. (There is only one deploy step, so the 2nd time it is called, it finalizes the deployment.)","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c9cfa05f91f7fb3fef46d150537bf1faf6f01fd5","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        self.assertNotIn(\u0027deploy_step_index\u0027, node.driver_internal_info)"},{"line_number":2219,"context_line":"        self.assertIsNone(node.driver_internal_info[\u0027deploy_steps\u0027])"},{"line_number":2220,"context_line":"        mock_execute.assert_has_calls \u003d [mock.call(self.deploy_steps[0]),"},{"line_number":2221,"context_line":"                                         mock.call(self.deploy_steps[1])]"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"    @mock.patch.object(conductor_utils, \u0027LOG\u0027, autospec\u003dTrue)"},{"line_number":2224,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_deploy_step\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_ba721baf","line":2221,"in_reply_to":"5f7c97a3_7b65a0e1","updated":"2018-07-18 13:38:14.000000000","message":"Well, you\u0027re creating an attribute assert_has_calls on the mock_execute mock object. I highly suspect you wanted to call assert_has_calls instead. Or does it work this way too?","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":2283,"context_line":"            self.assertEqual({}, node.deploy_step)"},{"line_number":2284,"context_line":"            self.assertNotIn(\u0027deploy_step_index\u0027, node.driver_internal_info)"},{"line_number":2285,"context_line":"            self.assertFalse(mock_execute.called)"},{"line_number":2286,"context_line":"            mock_execute.reset_mock()"},{"line_number":2287,"context_line":""},{"line_number":2288,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_deploy_step\u0027)"},{"line_number":2289,"context_line":"    def test_do_next_deploy_step_bad_step_return_value(self, mock_execute):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_becc9462","line":2286,"updated":"2018-07-16 08:38:25.000000000","message":"nit: not needed, though won\u0027t hurt either","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"088464e9e351f9402619e9aa28cd0e909c5fcf3b","unresolved":false,"context_lines":[{"line_number":2283,"context_line":"            self.assertEqual({}, node.deploy_step)"},{"line_number":2284,"context_line":"            self.assertNotIn(\u0027deploy_step_index\u0027, node.driver_internal_info)"},{"line_number":2285,"context_line":"            self.assertFalse(mock_execute.called)"},{"line_number":2286,"context_line":"            mock_execute.reset_mock()"},{"line_number":2287,"context_line":""},{"line_number":2288,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_deploy_step\u0027)"},{"line_number":2289,"context_line":"    def test_do_next_deploy_step_bad_step_return_value(self, mock_execute):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_bb6b38b7","line":2286,"in_reply_to":"5f7c97a3_becc9462","updated":"2018-07-16 20:33:23.000000000","message":"Yeah, it is one of those \u0027not-sure-which-is-better\u0027. I like to show that things are being \u0027reinit\u0027 so the user doesn\u0027t have to think, oh, it doesn\u0027t need to be reinit cuz it was never changed.\n\nI think I\u0027ll just leave this one in. It is a useful pattern in case someone copy/pastes part of this.","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"}],"ironic/tests/unit/conductor/test_utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.get_deploy_steps\u0027)"},{"line_number":987,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.get_deploy_steps\u0027)"},{"line_number":988,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeManagement.get_deploy_steps\u0027)"},{"line_number":989,"context_line":"    def test__get_deployment_steps(self, mock_mgt_steps, mock_power_steps,"},{"line_number":990,"context_line":"                                   mock_deploy_steps):"},{"line_number":991,"context_line":"        # Test getting deploy steps, with one driver returning None, two"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_7ea83c77","line":988,"updated":"2018-07-16 08:38:25.000000000","message":"nit: autospec\u003dTrue everywhere","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a71bf8b8209ef45e1dd88d502681560aca929d","unresolved":false,"context_lines":[{"line_number":1046,"context_line":"            mock_power_steps.assert_called_once_with(task)"},{"line_number":1047,"context_line":"            mock_deploy_steps.assert_called_once_with(task)"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    @mock.patch.object(conductor_utils, \u0027_get_deployment_steps\u0027)"},{"line_number":1050,"context_line":"    def test_set_node_deployment_steps(self, mock_steps):"},{"line_number":1051,"context_line":"        mock_steps.return_value \u003d self.deploy_steps"},{"line_number":1052,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_9ea3d89b","line":1049,"updated":"2018-07-16 08:38:25.000000000","message":"autospec\u003dTrue","commit_id":"65a68e4e96151f8190f9767e3ff6f8d5891af687"}]}
