)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ec5f969d7877c8dc80ad0503c577925b2073e248","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lucas Alvares Gomes \u003clucasagomes@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-04-13 15:11:26 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Agent: Do not power off node if deployment fail"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is adding a configuration option to the drivers using the IPA"},{"line_number":10,"context_line":"ramdisk (agent) called \"power_off_deploy_fail\", by default the value is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7aaa499b_b697a08f","line":7,"updated":"2015-04-14 13:49:50.000000000","message":"Maybe\n\nAgent: Add option to not power off node if deployment fails","commit_id":"300213ade5b6b3025c6c3bff2fa03050e1db5bb4"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"611882b1b0a9821296cbb3db95742354932b2c13","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lucas Alvares Gomes \u003clucasagomes@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-04-15 13:36:13 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Troubleshoot: Do not power off node if deployment fail"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is adding a configuration option to the drivers called"},{"line_number":10,"context_line":"\"power_off_deploy_fail\", by default the value is True and it will power"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5aa745d1_96c15ee7","line":7,"updated":"2015-04-16 16:03:32.000000000","message":"Oh, forgot to mention. I didn\u0027t know what this meant. You\u0027re adding a config option, so it seems like the title could be something like \u0027option to keep node powered on if deployment fails\u0027\n\nprobably not a big deal.","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"604ac53d25571e83c3e834fa2fe76c20e81e19ca","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lucas Alvares Gomes \u003clucasagomes@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-04-15 13:36:13 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Troubleshoot: Do not power off node if deployment fail"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is adding a configuration option to the drivers called"},{"line_number":10,"context_line":"\"power_off_deploy_fail\", by default the value is True and it will power"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7aaa499b_37f10a02","line":7,"updated":"2015-04-15 13:28:06.000000000","message":"s/fail/fails/","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"deb9771e221aa1763cbbc9201de60915ffb5f788","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lucas Alvares Gomes \u003clucasagomes@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-04-15 13:36:13 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Troubleshoot: Do not power off node if deployment fail"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is adding a configuration option to the drivers called"},{"line_number":10,"context_line":"\"power_off_deploy_fail\", by default the value is True and it will power"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"dac4157f_ad72f5ab","line":7,"in_reply_to":"5aa745d1_96c15ee7","updated":"2015-04-19 04:48:53.000000000","message":"+1","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bb947155408f5d9ae62183d24d9cc1323c33adfb","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lucas Alvares Gomes \u003clucasagomes@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-04-15 13:36:13 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Troubleshoot: Do not power off node if deployment fail"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is adding a configuration option to the drivers called"},{"line_number":10,"context_line":"\"power_off_deploy_fail\", by default the value is True and it will power"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5aa745d1_565cf624","line":7,"in_reply_to":"7aaa499b_37f10a02","updated":"2015-04-16 15:44:51.000000000","message":"Done","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"}],"doc/source/deploy/install-guide.rst":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0e344ff1ec4143fe441d05767676ab7a0335fdf0","unresolved":false,"context_lines":[{"line_number":1519,"context_line":"---------------------------------------"},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"By default Ironic will power off the nodes after the deployment"},{"line_number":1522,"context_line":"has failed, you can change this behavior by setting the"},{"line_number":1523,"context_line":"``power_off_deploy_fail`` configuration option to ``False``, e.g::"},{"line_number":1524,"context_line":""},{"line_number":1525,"context_line":"    [deploy]"}],"source_content_type":"text/x-rst","patch_set":4,"id":"5aa745d1_5b9e5f57","line":1522,"updated":"2015-04-16 15:36:07.000000000","message":"How about \u0027By default, if a deployment fails, the node will be powered off. You can change ...\u0027","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bb947155408f5d9ae62183d24d9cc1323c33adfb","unresolved":false,"context_lines":[{"line_number":1519,"context_line":"---------------------------------------"},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"By default Ironic will power off the nodes after the deployment"},{"line_number":1522,"context_line":"has failed, you can change this behavior by setting the"},{"line_number":1523,"context_line":"``power_off_deploy_fail`` configuration option to ``False``, e.g::"},{"line_number":1524,"context_line":""},{"line_number":1525,"context_line":"    [deploy]"}],"source_content_type":"text/x-rst","patch_set":4,"id":"5aa745d1_163f8eb5","line":1522,"in_reply_to":"5aa745d1_5b9e5f57","updated":"2015-04-16 15:44:51.000000000","message":"Done","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0e344ff1ec4143fe441d05767676ab7a0335fdf0","unresolved":false,"context_lines":[{"line_number":1528,"context_line":""},{"line_number":1529,"context_line":"That will ensure that the node remains powered on and is put in"},{"line_number":1530,"context_line":"maintenance mode in case the deployment fails so that you have access"},{"line_number":1531,"context_line":"to all the logs from the deploy ramdisk."}],"source_content_type":"text/x-rst","patch_set":4,"id":"5aa745d1_1b49f731","line":1531,"updated":"2015-04-16 15:36:07.000000000","message":"how about \u0027If a deployment fails, the node will be put in maintenance mode and remain powered on. You can now access all the logs...\u0027.\n\nWhat if someone asks you how they can access the logs? :-)","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bb947155408f5d9ae62183d24d9cc1323c33adfb","unresolved":false,"context_lines":[{"line_number":1528,"context_line":""},{"line_number":1529,"context_line":"That will ensure that the node remains powered on and is put in"},{"line_number":1530,"context_line":"maintenance mode in case the deployment fails so that you have access"},{"line_number":1531,"context_line":"to all the logs from the deploy ramdisk."}],"source_content_type":"text/x-rst","patch_set":4,"id":"5aa745d1_36696abf","line":1531,"in_reply_to":"5aa745d1_1b49f731","updated":"2015-04-16 15:44:51.000000000","message":"Done","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"}],"ironic/drivers/modules/agent_base_vendor.py":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"eb93a8ad6bfde1d97b9803c20f813f50aa3b3be5","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    cfg.IntOpt(\u0027heartbeat_timeout\u0027,"},{"line_number":44,"context_line":"               default\u003d300,"},{"line_number":45,"context_line":"               help\u003d\u0027Maximum interval (in seconds) for agent heartbeats.\u0027),"},{"line_number":46,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":47,"context_line":"                default\u003dTrue,"},{"line_number":48,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":49,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aaa499b_90c5c43d","line":46,"updated":"2015-04-14 05:34:28.000000000","message":"Does it make sense to put it under deploy group as this is applicable for dib ramdisk deploys and *not* only agent deploys. We can place this definition of opt in deploy_utils itself.","commit_id":"300213ade5b6b3025c6c3bff2fa03050e1db5bb4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"78dc870412609426be4d0d9aa39b42f94bfbd816","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    cfg.IntOpt(\u0027heartbeat_timeout\u0027,"},{"line_number":44,"context_line":"               default\u003d300,"},{"line_number":45,"context_line":"               help\u003d\u0027Maximum interval (in seconds) for agent heartbeats.\u0027),"},{"line_number":46,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":47,"context_line":"                default\u003dTrue,"},{"line_number":48,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":49,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aaa499b_622703b7","line":46,"in_reply_to":"7aaa499b_90c5c43d","updated":"2015-04-14 10:04:52.000000000","message":"That\u0027s a good idea","commit_id":"300213ade5b6b3025c6c3bff2fa03050e1db5bb4"}],"ironic/drivers/modules/deploy_utils.py":[{"author":{"_account_id":12715,"name":"John Trowbridge","email":"trown@redhat.com","username":"trown"},"change_message_id":"a2ee7af3d1f750eaf36dd35e12a29a94bb18a8ea","unresolved":false,"context_lines":[{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    This method sets the deployment as fail with the given message."},{"line_number":819,"context_line":"    It sets node\u0027s provision_state to DEPLOYFAIL and updates last_error"},{"line_number":820,"context_line":"    with the given error message. It also powers off the baremetal node."},{"line_number":821,"context_line":""},{"line_number":822,"context_line":"    :param task: a TaskManager instance containing the node to act on."},{"line_number":823,"context_line":"    :param msg: the message to set in last_error of the node."}],"source_content_type":"text/x-python","patch_set":1,"id":"7aaa499b_add51444","line":820,"updated":"2015-04-13 19:10:56.000000000","message":"Do we also want to update the docstring to reference the new configuration option?","commit_id":"300213ade5b6b3025c6c3bff2fa03050e1db5bb4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"78dc870412609426be4d0d9aa39b42f94bfbd816","unresolved":false,"context_lines":[{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    This method sets the deployment as fail with the given message."},{"line_number":819,"context_line":"    It sets node\u0027s provision_state to DEPLOYFAIL and updates last_error"},{"line_number":820,"context_line":"    with the given error message. It also powers off the baremetal node."},{"line_number":821,"context_line":""},{"line_number":822,"context_line":"    :param task: a TaskManager instance containing the node to act on."},{"line_number":823,"context_line":"    :param msg: the message to set in last_error of the node."}],"source_content_type":"text/x-python","patch_set":1,"id":"7aaa499b_0224bfac","line":820,"in_reply_to":"7aaa499b_add51444","updated":"2015-04-14 10:04:52.000000000","message":"+1","commit_id":"300213ade5b6b3025c6c3bff2fa03050e1db5bb4"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"485c3a2512979ebf31ba94ca05e24843349d6d29","unresolved":false,"context_lines":[{"line_number":838,"context_line":"    node \u003d task.node"},{"line_number":839,"context_line":"    try:"},{"line_number":840,"context_line":"        if CONF.deploy.power_off_deploy_fail:"},{"line_number":841,"context_line":"            manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":842,"context_line":"        else:"},{"line_number":843,"context_line":"            node.maintenance \u003d True"},{"line_number":844,"context_line":"            node.maintenance_reason \u003d _(\u0027Avoiding powering off after \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aaa499b_54cb771e","line":841,"updated":"2015-04-15 12:00:00.000000000","message":"Please place try/except around l841, and remove line with \u0027finally\u0027 (it is not needed because we catch all exceptions).","commit_id":"34375cb86198f77117b47fa709b541d02666bb06"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0e344ff1ec4143fe441d05767676ab7a0335fdf0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d3,"},{"line_number":64,"context_line":"               help\u003d\u0027Maximum attempts to verify an iSCSI connection is \u0027"},{"line_number":65,"context_line":"                    \u0027active, sleeping 1 second between attempts.\u0027),"},{"line_number":66,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":67,"context_line":"                default\u003dTrue,"},{"line_number":68,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":69,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_7b26bb69","line":66,"updated":"2015-04-16 15:36:07.000000000","message":"might just be me, but I prefer \u0027deploy_fail_power_on\u0027","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"fad112a546b0e0a820b163bd2cc1a0f0ef9a28a9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d3,"},{"line_number":64,"context_line":"               help\u003d\u0027Maximum attempts to verify an iSCSI connection is \u0027"},{"line_number":65,"context_line":"                    \u0027active, sleeping 1 second between attempts.\u0027),"},{"line_number":66,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":67,"context_line":"                default\u003dTrue,"},{"line_number":68,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":69,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_23c92c79","line":66,"in_reply_to":"3ab451fb_09cf7cb1","updated":"2015-04-20 20:17:50.000000000","message":"If you\u0027re ok with it, then that\u0027s fine. No one else seems to object.\n\nI think it is because I parsed it as \u0027power off deploy\u0027 (like, \u0027power off something\u0027), whereas you mean \u0027power off if the deploy fails\u0027. And I think of it (maybe cuz I code) as \"if DEPLOY FAIL, then POWER OFF\u0027. And then, because I like the positive, I thought of \u0027power on\u0027 instead of \u0027power off\u0027. But the help explains it so it probably isn\u0027t a big deal.\n\nWording of things is difficult ;)","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a19be9c9353b99c74972c34b42d483267b8f5716","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d3,"},{"line_number":64,"context_line":"               help\u003d\u0027Maximum attempts to verify an iSCSI connection is \u0027"},{"line_number":65,"context_line":"                    \u0027active, sleeping 1 second between attempts.\u0027),"},{"line_number":66,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":67,"context_line":"                default\u003dTrue,"},{"line_number":68,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":69,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3ab451fb_09cf7cb1","line":66,"in_reply_to":"3ab451fb_a91d2868","updated":"2015-04-17 13:08:24.000000000","message":"@Ruby is the name \"power_off_deploy_fail\" too bad? Can we keep it? I\u0027m particularly fine with it too","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bb947155408f5d9ae62183d24d9cc1323c33adfb","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d3,"},{"line_number":64,"context_line":"               help\u003d\u0027Maximum attempts to verify an iSCSI connection is \u0027"},{"line_number":65,"context_line":"                    \u0027active, sleeping 1 second between attempts.\u0027),"},{"line_number":66,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":67,"context_line":"                default\u003dTrue,"},{"line_number":68,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":69,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_f690a297","line":66,"in_reply_to":"5aa745d1_7b26bb69","updated":"2015-04-16 15:44:51.000000000","message":"Hmm \"deploy_fail_power_on\" kinda sounds like we are powering it on if deloy fails... Unless it\u0027s like \"deploy_fail_keep_power_on\" ? \n\nI will leave as it for the next patch-set","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"de11c83f99f2491980b4bd96c62d518206dcb420","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d3,"},{"line_number":64,"context_line":"               help\u003d\u0027Maximum attempts to verify an iSCSI connection is \u0027"},{"line_number":65,"context_line":"                    \u0027active, sleeping 1 second between attempts.\u0027),"},{"line_number":66,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":67,"context_line":"                default\u003dTrue,"},{"line_number":68,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":69,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3ab451fb_a91d2868","line":66,"in_reply_to":"5aa745d1_ca55f6c6","updated":"2015-04-17 13:02:04.000000000","message":"Re-reading the names again and again, I am kind of okay with all the names :)  But I would prefer to have ****_power_off\u003dTrue rather than ***_power_on\u003dFalse because the former has the current behaviour in it.\n\nBut my personal preference would be power_off_deploy_fail (than power_off_if_fail) as it seems quite direct to me at first sight.","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"611882b1b0a9821296cbb3db95742354932b2c13","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d3,"},{"line_number":64,"context_line":"               help\u003d\u0027Maximum attempts to verify an iSCSI connection is \u0027"},{"line_number":65,"context_line":"                    \u0027active, sleeping 1 second between attempts.\u0027),"},{"line_number":66,"context_line":"    cfg.BoolOpt(\u0027power_off_deploy_fail\u0027,"},{"line_number":67,"context_line":"                default\u003dTrue,"},{"line_number":68,"context_line":"                help\u003d\u0027If True power off the node when the deployment fails. \u0027"},{"line_number":69,"context_line":"                     \u0027If False put the node in maintenance mode and keep \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_ca55f6c6","line":66,"in_reply_to":"5aa745d1_f690a297","updated":"2015-04-16 16:03:32.000000000","message":"deploy_fail_keep_power_on is good with me.\n\nor deploy_fail_power_off.\n\nIt occurred to me that this is in the [deploy] group, so probably don\u0027t need \u0027deploy\u0027 in the name.\n\nSo maybe this is the shortest/clearest: \u0027power_off_if_fail\u0027? \u0027fail_keep_power_on\u0027?","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0e344ff1ec4143fe441d05767676ab7a0335fdf0","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        node.maintenance \u003d True"},{"line_number":850,"context_line":"        node.maintenance_reason \u003d _(\u0027Avoiding powering off after \u0027"},{"line_number":851,"context_line":"                                    \u0027deployment failed\u0027)"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    # NOTE(deva): node_power_action() erases node.last_error"},{"line_number":854,"context_line":"    #             so we need to set it again here."}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_7bd11bcd","line":851,"updated":"2015-04-16 15:36:07.000000000","message":"hmm. What about \u0027Deployment failed, leaving node powered on.\u0027","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bb947155408f5d9ae62183d24d9cc1323c33adfb","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        node.maintenance \u003d True"},{"line_number":850,"context_line":"        node.maintenance_reason \u003d _(\u0027Avoiding powering off after \u0027"},{"line_number":851,"context_line":"                                    \u0027deployment failed\u0027)"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    # NOTE(deva): node_power_action() erases node.last_error"},{"line_number":854,"context_line":"    #             so we need to set it again here."}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_d68da67c","line":851,"in_reply_to":"5aa745d1_7bd11bcd","updated":"2015-04-16 15:44:51.000000000","message":"Done","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"bf4c62a409de56fa0b3f2f34553a967440b1bedc","unresolved":false,"context_lines":[{"line_number":843,"context_line":"            msg2 \u003d (_LE(\u0027Node %s failed to power off while handling deploy \u0027"},{"line_number":844,"context_line":"                        \u0027failure. This may be a serious condition. Node \u0027"},{"line_number":845,"context_line":"                        \u0027should be removed from Ironic or put in maintenance \u0027"},{"line_number":846,"context_line":"                        \u0027mode until the problem is resolved.\u0027) % node.uuid)"},{"line_number":847,"context_line":"            LOG.exception(msg2)"},{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        node.maintenance \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"dac4157f_60bb8d73","line":846,"updated":"2015-04-21 04:45:31.000000000","message":"Why aren\u0027t we move the node into maintenance here? Can\u0027t we apply the same case as in when user explicitly configures the node to \"power_off_deploy_fail\"\u003dfalse","commit_id":"5c8bdde843a7034ff4bef3ea1c4a16eb0a9a1c57"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"678b9215264fdf2e6905e8eefe8f47c6fda8b52b","unresolved":false,"context_lines":[{"line_number":843,"context_line":"            msg2 \u003d (_LE(\u0027Node %s failed to power off while handling deploy \u0027"},{"line_number":844,"context_line":"                        \u0027failure. This may be a serious condition. Node \u0027"},{"line_number":845,"context_line":"                        \u0027should be removed from Ironic or put in maintenance \u0027"},{"line_number":846,"context_line":"                        \u0027mode until the problem is resolved.\u0027) % node.uuid)"},{"line_number":847,"context_line":"            LOG.exception(msg2)"},{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        node.maintenance \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"dac4157f_6a5ec313","line":846,"in_reply_to":"dac4157f_60bb8d73","updated":"2015-04-21 08:47:29.000000000","message":"It could be done in another patch, it\u0027s a valid suggestion. But this patch doesn\u0027t intent to change the default behavior of Ironic, it\u0027s out of the scope for this change.","commit_id":"5c8bdde843a7034ff4bef3ea1c4a16eb0a9a1c57"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c86d55aab51b76f50ca8cc378ac6b66db9a2169d","unresolved":false,"context_lines":[{"line_number":843,"context_line":"            msg2 \u003d (_LE(\u0027Node %s failed to power off while handling deploy \u0027"},{"line_number":844,"context_line":"                        \u0027failure. This may be a serious condition. Node \u0027"},{"line_number":845,"context_line":"                        \u0027should be removed from Ironic or put in maintenance \u0027"},{"line_number":846,"context_line":"                        \u0027mode until the problem is resolved.\u0027) % node.uuid)"},{"line_number":847,"context_line":"            LOG.exception(msg2)"},{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        node.maintenance \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"3acd31a7_bbe7b911","line":846,"in_reply_to":"dac4157f_6a5ec313","updated":"2015-04-29 23:50:36.000000000","message":"+1 for not changing the default behavior here.","commit_id":"5c8bdde843a7034ff4bef3ea1c4a16eb0a9a1c57"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c86d55aab51b76f50ca8cc378ac6b66db9a2169d","unresolved":false,"context_lines":[{"line_number":849,"context_line":"        node.maintenance \u003d True"},{"line_number":850,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":851,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    # NOTE(deva): node_power_action() erases node.last_error"},{"line_number":854,"context_line":"    #             so we need to set it again here."},{"line_number":855,"context_line":"    node.last_error \u003d msg"}],"source_content_type":"text/x-python","patch_set":5,"id":"3acd31a7_fb81b1fc","line":852,"updated":"2015-04-29 23:50:36.000000000","message":"just an thought. would it be worth logging something here like the default behavior so a operator would under stand that this node is left on and there for not available for redeploy until maintenance mode is cleared?","commit_id":"5c8bdde843a7034ff4bef3ea1c4a16eb0a9a1c57"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8dd0e0780cea9e9d4e715557e91488d48cd478a3","unresolved":false,"context_lines":[{"line_number":849,"context_line":"        node.maintenance \u003d True"},{"line_number":850,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":851,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    # NOTE(deva): node_power_action() erases node.last_error"},{"line_number":854,"context_line":"    #             so we need to set it again here."},{"line_number":855,"context_line":"    node.last_error \u003d msg"}],"source_content_type":"text/x-python","patch_set":5,"id":"3acd31a7_615a8885","line":852,"in_reply_to":"3acd31a7_fb81b1fc","updated":"2015-04-30 09:24:59.000000000","message":"Hi Chris, sure I will add some logs here","commit_id":"5c8bdde843a7034ff4bef3ea1c4a16eb0a9a1c57"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"4a84889548584f6f205263eb9764fe52c06ba930","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_becc2b36","line":851,"updated":"2015-04-30 15:56:58.000000000","message":"Do we need to maintenance it? The node is in a failed state, it won\u0027t be deployed to. It\u0027s quite possible the failure was unrelated to the node itself (network connectivity, other OpenStack services failing like Glance/Swift/Neutron). I see maintenance as something like \"an operator really needs to look at this node, possibly physically, don\u0027t do anything to this node\".","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"4738993b891b1683f7f1649f43bb5a20f1136fc4","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1aca2d91_b47c6c21","line":851,"updated":"2015-05-06 12:32:38.000000000","message":"I believe Ruby is correct. If the instance is not deleted, the user\u0027s quota is affected.\n\nHowever, if I\u0027m reading correctly, instance deletion is allowed for nodes in maintenance mode. When Nova tries to delete the failed instance (whether automatically or through explicit user action) it will succeed. Ironic will call conductorManager.do_node_tear_down(), deleting the instance and powering off the node, but leaving it in maintenance mode.\n\nI don\u0027t think that\u0027s what you intend.","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7e5a385857c11d2b6e76f8981ef290284fc4acdd","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1aca2d91_4ed8e453","line":851,"in_reply_to":"1aca2d91_b47c6c21","updated":"2015-05-06 13:29:21.000000000","message":"Hi Deva, ruby...\n\ntl;dr I will try to find a better way of doing it without relying on maintenance. I\u0027ve used this config for developing IPA and turns out it\u0027s pretty useful to have the logs handy when you\u0027re creating a new extension. That was my motivation.\n\n...\n\nAbout the quota it won\u0027t affect the user quota because they instance never succeed to deploy, so nova reserves the quota but it won\u0027t commit it when then instance fail.\n\n \u003cnikola\u003e lucasagomes, it\u0027s reserved when it starts, and then \"commited\" when successful\n \u003cnikola\u003e or rolled back if not\n\nYeah this patch was adding a check in nova to not destroy() if the node was in maitenance, that got merged. But since the RAX was relying on allowing people delete when the instance is in maintenance for their workflow I reverted that patch in nova[1]\n\n[1] https://review.openstack.org/180446","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"ad01355435c7533d7dc7792740ec70bedb34a8bd","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_f18bd81c","line":851,"in_reply_to":"3acd31a7_80d105d0","updated":"2015-05-01 16:53:21.000000000","message":"AFAICT nova tries to allocate the resources for the instance before starting the deployment.","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"13c310a66ea7ddb90dd71dc53f07c663cc9a755b","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_80d105d0","line":851,"in_reply_to":"3acd31a7_99b62989","updated":"2015-04-30 20:20:25.000000000","message":"Dumb question. In nova, when is the quota \u0027taken away\u0027 from a tenant? Before this deploying is started or after it is successful?","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b898ff2b6e81d09f0a5cf8d5e9c209ad3bdbb6f9","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_f9d87d1f","line":851,"in_reply_to":"3acd31a7_b96325b1","updated":"2015-04-30 16:12:55.000000000","message":"Ahh right, that makes sense. Scratch that about running it in production, but this would be really helpful for testing. Works for me!","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c30aabc6f7424cf4fabef23c41be0e37661b0c90","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_b96325b1","line":851,"in_reply_to":"3acd31a7_becc2b36","updated":"2015-04-30 16:05:31.000000000","message":"Yeah we need it otherwise the Nova will try to automatically destroy the instance and it will cause Ironic to tear down and power off the node, leaving the failed state and becoming available again.","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"71b2c5fc1d4d79265bb5b1b41f2afcf48323626d","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_79866a66","line":851,"in_reply_to":"3acd31a7_f18bd81c","updated":"2015-05-04 15:54:07.000000000","message":"So if we get to this situation, it means the tenant\u0027s quota has been reduced to account for this new instance, but the deploy failed, and nova is not going to automatically destroy it, so the tenant doesn\u0027t get their instance and they\u0027ve \"lost\" some of their quota? If that\u0027s true, I don\u0027t think that will make users happy.\n\nOr was it always the case (before this change), that the user didn\u0027t get their quota back if the deploy failed?","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4562841b0c8e0199042b7c2db473d6f9a32422cd","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    else:"},{"line_number":849,"context_line":"        LOG.debug(\u0027Node %s deployment fail. Putting the node in maintenance \u0027"},{"line_number":850,"context_line":"                  \u0027and leaving it powered on for troubleshooting.\u0027, node.uuid)"},{"line_number":851,"context_line":"        node.maintenance \u003d True"},{"line_number":852,"context_line":"        node.maintenance_reason \u003d _(\u0027Deployment failed, leaving node \u0027"},{"line_number":853,"context_line":"                                    \u0027powered on\u0027)"},{"line_number":854,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_99b62989","line":851,"in_reply_to":"3acd31a7_f9d87d1f","updated":"2015-04-30 16:18:41.000000000","message":"Yeah, def this is disabled by default (default config options should be production ready).\n\nI\u0027ve added this downstream before when I was working with IPA actually, developing the iSCSI bits and it was handy to have access to the logs so I could figure out what went wrong.","commit_id":"da81112292f8cd9cba76f66ffd4b45f5ca171627"}],"ironic/tests/drivers/test_deploy_utils.py":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"88e3b39c465106d556d3502466d469750560121e","unresolved":false,"context_lines":[{"line_number":1004,"context_line":"        self.assertRaises(exception.InvalidParameterValue,"},{"line_number":1005,"context_line":"                          utils.parse_root_device_hints, self.node)"},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"    @mock.patch.object(manager_utils, \u0027node_power_action\u0027)"},{"line_number":1008,"context_line":"    def test_set_failed_state(self, mock_power):"},{"line_number":1009,"context_line":"        last_error \u003d \u0027Call me Daredevil\u0027"},{"line_number":1010,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake_pxe\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_27fa5abe","line":1007,"updated":"2015-04-16 14:29:56.000000000","message":"autospec\u003dTrue","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bb947155408f5d9ae62183d24d9cc1323c33adfb","unresolved":false,"context_lines":[{"line_number":1004,"context_line":"        self.assertRaises(exception.InvalidParameterValue,"},{"line_number":1005,"context_line":"                          utils.parse_root_device_hints, self.node)"},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"    @mock.patch.object(manager_utils, \u0027node_power_action\u0027)"},{"line_number":1008,"context_line":"    def test_set_failed_state(self, mock_power):"},{"line_number":1009,"context_line":"        last_error \u003d \u0027Call me Daredevil\u0027"},{"line_number":1010,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake_pxe\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_76ca52a3","line":1007,"in_reply_to":"5aa745d1_27fa5abe","updated":"2015-04-16 15:44:51.000000000","message":"Done","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"88e3b39c465106d556d3502466d469750560121e","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"        self.assertFalse(node.maintenance)"},{"line_number":1020,"context_line":"        self.assertIsNone(node.maintenance_reason)"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"    @mock.patch.object(manager_utils, \u0027node_power_action\u0027)"},{"line_number":1023,"context_line":"    def test_set_failed_state_dont_power_off(self, mock_power):"},{"line_number":1024,"context_line":"        self.config(power_off_deploy_fail\u003dFalse, group\u003d\u0027deploy\u0027)"},{"line_number":1025,"context_line":"        last_error \u003d \u0027I can see just fine\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_e70352b7","line":1022,"updated":"2015-04-16 14:29:56.000000000","message":"autospec\u003dTrue","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bb947155408f5d9ae62183d24d9cc1323c33adfb","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"        self.assertFalse(node.maintenance)"},{"line_number":1020,"context_line":"        self.assertIsNone(node.maintenance_reason)"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"    @mock.patch.object(manager_utils, \u0027node_power_action\u0027)"},{"line_number":1023,"context_line":"    def test_set_failed_state_dont_power_off(self, mock_power):"},{"line_number":1024,"context_line":"        self.config(power_off_deploy_fail\u003dFalse, group\u003d\u0027deploy\u0027)"},{"line_number":1025,"context_line":"        last_error \u003d \u0027I can see just fine\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aa745d1_56cf56b0","line":1022,"in_reply_to":"5aa745d1_e70352b7","updated":"2015-04-16 15:44:51.000000000","message":"Done","commit_id":"5e2cd2189fc26589ebafd3d37f4786e4cc594624"}]}
