)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"741750f45c2534b7cd50115dfd36169592effa76","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  configured, and when the node is in ACTIVE state."},{"line_number":14,"context_line":"* Node deployment and node tear_down operations."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"In addition to attachment and detachment, driver_interal_info"},{"line_number":17,"context_line":"is now  populated with a boot from volume target uuid, if a"},{"line_number":18,"context_line":"volume is defined for the node."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ba5201f7_dd9f6501","line":16,"range":{"start_line":16,"start_character":42,"end_line":16,"end_character":61},"updated":"2017-01-03 18:40:29.000000000","message":"nit: typo in driver_internal_info","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  configured, and when the node is in ACTIVE state."},{"line_number":14,"context_line":"* Node deployment and node tear_down operations."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"In addition to attachment and detachment, driver_interal_info"},{"line_number":17,"context_line":"is now  populated with a boot from volume target uuid, if a"},{"line_number":18,"context_line":"volume is defined for the node."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ba5201f7_cc0bf522","line":16,"range":{"start_line":16,"start_character":42,"end_line":16,"end_character":61},"in_reply_to":"ba5201f7_dd9f6501","updated":"2017-01-11 21:22:04.000000000","message":"Done","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"}],"ironic/conductor/utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"32e0d5797760df68fa77948645e5ee3840367589","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            # NOTE(TheJulia): When we explicitly power-on a node"},{"line_number":146,"context_line":"            # we should call call for any volumes to be attached."},{"line_number":147,"context_line":"            if (new_state \u003d\u003d states.POWER_ON and"},{"line_number":148,"context_line":"                    task.node.storage_interface !\u003d \u0027noop\u0027 and"},{"line_number":149,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":150,"context_line":"                task.driver.storage.attach_volumes(task)"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_d7e9a51b","line":148,"range":{"start_line":148,"start_character":20,"end_line":148,"end_character":57},"updated":"2016-12-12 14:44:48.000000000","message":"I don\u0027t think we need this check, attach_volumes is a no-op for the noop driver :) Bonus point for not hardcoding entry point name.","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a24a4ed40f5e5c53eb35dac16d26e4baa59fe908","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            # NOTE(TheJulia): When we explicitly power-on a node"},{"line_number":146,"context_line":"            # we should call call for any volumes to be attached."},{"line_number":147,"context_line":"            if (new_state \u003d\u003d states.POWER_ON and"},{"line_number":148,"context_line":"                    task.node.storage_interface !\u003d \u0027noop\u0027 and"},{"line_number":149,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":150,"context_line":"                task.driver.storage.attach_volumes(task)"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_aabe49ab","line":148,"range":{"start_line":148,"start_character":20,"end_line":148,"end_character":57},"in_reply_to":"3a71b18c_d7e9a51b","updated":"2016-12-16 21:59:56.000000000","message":"Agreed, done.","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"32e0d5797760df68fa77948645e5ee3840367589","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            # NOTE(TheJulia): Similarlly to power-on, when we power-off"},{"line_number":155,"context_line":"            # a node, we should detach any volume attachments."},{"line_number":156,"context_line":"            if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":157,"context_line":"                    task.node.storage_interface !\u003d \u0027noop\u0027 and"},{"line_number":158,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":159,"context_line":"                task.driver.storage.detach_volumes(task)"},{"line_number":160,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_97e48d3c","line":157,"range":{"start_line":157,"start_character":21,"end_line":157,"end_character":57},"updated":"2016-12-12 14:44:48.000000000","message":"ditto","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a24a4ed40f5e5c53eb35dac16d26e4baa59fe908","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            # NOTE(TheJulia): Similarlly to power-on, when we power-off"},{"line_number":155,"context_line":"            # a node, we should detach any volume attachments."},{"line_number":156,"context_line":"            if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":157,"context_line":"                    task.node.storage_interface !\u003d \u0027noop\u0027 and"},{"line_number":158,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":159,"context_line":"                task.driver.storage.detach_volumes(task)"},{"line_number":160,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_8ac34d37","line":157,"range":{"start_line":157,"start_character":21,"end_line":157,"end_character":57},"in_reply_to":"3a71b18c_97e48d3c","updated":"2016-12-16 21:59:56.000000000","message":"Done","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":10453,"name":"octopuszhang","email":"zhangyf@rc.inesa.com","username":"1"},"change_message_id":"82f395a9e9bb7bbbe8b73c86076ad73b75bdf0b7","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    try:"},{"line_number":144,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":145,"context_line":"            # NOTE(TheJulia): When we explicitly power-on a node"},{"line_number":146,"context_line":"            # we should call call for any volumes to be attached."},{"line_number":147,"context_line":"            if (new_state \u003d\u003d states.POWER_ON and"},{"line_number":148,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":149,"context_line":"                task.driver.storage.attach_volumes(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_fc2f07f4","line":146,"range":{"start_line":146,"start_character":24,"end_line":146,"end_character":33},"updated":"2016-12-30 09:00:47.000000000","message":"nit","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    try:"},{"line_number":144,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":145,"context_line":"            # NOTE(TheJulia): When we explicitly power-on a node"},{"line_number":146,"context_line":"            # we should call call for any volumes to be attached."},{"line_number":147,"context_line":"            if (new_state \u003d\u003d states.POWER_ON and"},{"line_number":148,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":149,"context_line":"                task.driver.storage.attach_volumes(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_38c2ff34","line":146,"range":{"start_line":146,"start_character":24,"end_line":146,"end_character":33},"in_reply_to":"ba5201f7_fc2f07f4","updated":"2017-01-11 21:22:04.000000000","message":"Done","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"741750f45c2534b7cd50115dfd36169592effa76","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            task.driver.power.set_power_state(task, new_state)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            # NOTE(TheJulia): Similarlly to power-on, when we power-off"},{"line_number":154,"context_line":"            # a node, we should detach any volume attachments."},{"line_number":155,"context_line":"            if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":156,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_7d8f59cc","line":153,"range":{"start_line":153,"start_character":30,"end_line":153,"end_character":40},"updated":"2017-01-03 18:40:29.000000000","message":"nit: similarly","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            task.driver.power.set_power_state(task, new_state)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            # NOTE(TheJulia): Similarlly to power-on, when we power-off"},{"line_number":154,"context_line":"            # a node, we should detach any volume attachments."},{"line_number":155,"context_line":"            if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":156,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_18c9bb59","line":153,"range":{"start_line":153,"start_character":30,"end_line":153,"end_character":40},"in_reply_to":"ba5201f7_7d8f59cc","updated":"2017-01-11 21:22:04.000000000","message":"Done","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"741750f45c2534b7cd50115dfd36169592effa76","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                task.driver.storage.detach_volumes(task)"},{"line_number":158,"context_line":"        else:"},{"line_number":159,"context_line":"            task.driver.power.reboot(task)"},{"line_number":160,"context_line":"    except Exception as e:"},{"line_number":161,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":162,"context_line":"            node[\u0027target_power_state\u0027] \u003d states.NOSTATE"},{"line_number":163,"context_line":"            node[\u0027last_error\u0027] \u003d _("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_5d829595","line":160,"updated":"2017-01-03 18:40:29.000000000","message":"I worry about an inconsistency that might occur with powering off here. If detaching the storage volume when powering off fails, the node\u0027s hardware power state might be POWER_OFF since we already passed along that command to the driver. However, the current power state in the DB will be POWER_ON or whatever it was prior to the power action.","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                task.driver.storage.detach_volumes(task)"},{"line_number":158,"context_line":"        else:"},{"line_number":159,"context_line":"            task.driver.power.reboot(task)"},{"line_number":160,"context_line":"    except Exception as e:"},{"line_number":161,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":162,"context_line":"            node[\u0027target_power_state\u0027] \u003d states.NOSTATE"},{"line_number":163,"context_line":"            node[\u0027last_error\u0027] \u003d _("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_475d1e14","line":160,"in_reply_to":"ba5201f7_59daf718","updated":"2017-01-11 21:22:04.000000000","message":"I\u0027m going to move it past when we record success for now.  Seems like the most logical thing, although this entire method is teetering on being too complex to pass pep8 at our current complexity threshold. :(","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f3753fdac6c3510e3a7e63cd42af1527264ab35e","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                task.driver.storage.detach_volumes(task)"},{"line_number":158,"context_line":"        else:"},{"line_number":159,"context_line":"            task.driver.power.reboot(task)"},{"line_number":160,"context_line":"    except Exception as e:"},{"line_number":161,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":162,"context_line":"            node[\u0027target_power_state\u0027] \u003d states.NOSTATE"},{"line_number":163,"context_line":"            node[\u0027last_error\u0027] \u003d _("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_59daf718","line":160,"in_reply_to":"ba5201f7_5d829595","updated":"2017-01-09 10:44:47.000000000","message":"Good point, if that fails we won\u0027t set the node[\u0027power_state\u0027] \u003d target_state (L172) and it will be inconsistent (it will probably be corrected later with the sync, but we should avoid it if possible).\n\nWe could move the code handling the failure to a command function and have try..except blocks for each of the actions (attach, power action, detach)","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"44f7a4cb3d9cee43e7a5ccc83bb14327806f6776","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                    {\u0027driver_name\u0027: node.driver})"},{"line_number":177,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        else:"},{"line_number":180,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":181,"context_line":"                    task.driver.power.reboot).parameters):"},{"line_number":182,"context_line":"                task.driver.power.reboot(task, timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a3c09a3_7f60c901","line":179,"updated":"2017-01-17 17:02:27.000000000","message":"don\u0027t we need to attach volumes here as well? or we just keep them attached during reboot? I wonder if we should at least verify that they\u0027re properly attached","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"232e4c8f78a1ce74dcc65d2736730f71d790fcfb","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                    {\u0027driver_name\u0027: node.driver})"},{"line_number":177,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        else:"},{"line_number":180,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":181,"context_line":"                    task.driver.power.reboot).parameters):"},{"line_number":182,"context_line":"                task.driver.power.reboot(task, timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_2b58cc89","line":179,"in_reply_to":"7a3c09a3_7f60c901","updated":"2017-02-14 21:46:11.000000000","message":"The specification, as I recall it, called for when power was explicitly turned on and off, not what could be a quick reboot.  I guess we could change that.  I think an in-line todo is appropriate for now since that feels a little bit like creep.\n\nThere really is no way to verify.  We can check that an attachment record exists, but cinder does not keep what was submitted as the connector information, so there is nothing for us to really verify. :(","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"39973cc4d066bebd92a732301009c0ad743bf310","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":219,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":220,"context_line":"                node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":221,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"@task_manager.require_exclusive_lock"}],"source_content_type":"text/x-python","patch_set":15,"id":"da36d5c6_bd85975a","line":221,"updated":"2017-02-27 16:47:17.000000000","message":"Detached volumes gets available state which means the volumes can be attached by other nodes. If a volume is attached by another node, the original node will fail power on. We need to keep reservation for the volumes although I\u0027m afraid I\u0027m not sure what is required from cinder when a node is turned off.","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"45c32bdf8bdd44326b21e42bbd8d5bf5a5970c57","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":219,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":220,"context_line":"                node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":221,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"@task_manager.require_exclusive_lock"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a1ff146_2574c8cd","line":221,"in_reply_to":"da36d5c6_bd85975a","updated":"2017-03-16 15:14:34.000000000","message":"Having dug into that, I think that really comes down to the individual back-end driver.  I kind of see this as intended, and trying to hold any sort of lock, as if having the volume in some transient state seems like it can be confusing, when it is not all that uncommon to detach a volume from a server, attach it to another server to do some work, and then re-attach it to the original server while that server is off.","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"86fd0fa9d3cb27c578c189adba3bbc25752d184d","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        else:"},{"line_number":179,"context_line":"            # TODO(TheJulia): We likely ought to consider toggling"},{"line_number":180,"context_line":"            # volume attachments, although we have no mechanism to"},{"line_number":181,"context_line":"            # really verify what cinder has connector wise."},{"line_number":182,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":183,"context_line":"                    task.driver.power.reboot).parameters):"},{"line_number":184,"context_line":"                task.driver.power.reboot(task, timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_5410364e","line":181,"updated":"2017-05-24 12:21:25.000000000","message":"mmmm, the problem is that it\u0027s perfectly valid to power on the machine using the reboot call (this is how inspector does it, for example). so I think we should fix this TODO quite soon. I wonder if we just need to make attach_volumes idempotent..","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"86fd0fa9d3cb27c578c189adba3bbc25752d184d","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":218,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":219,"context_line":"                node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":220,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"@task_manager.require_exclusive_lock"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_341b8273","line":220,"updated":"2017-05-24 12:21:25.000000000","message":"I wonder if we should do anything with volumes, if a node is in maintenance mode..","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6fb5bc2ab8bf78a5957b9c62ffca6ca8d3ac38e8","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":218,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":219,"context_line":"                node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":220,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"@task_manager.require_exclusive_lock"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_88b1e646","line":220,"in_reply_to":"ff0f0b1f_341b8273","updated":"2017-05-25 15:30:09.000000000","message":"I don\u0027t think","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf2fb716db27b9062d685947b78f9c2ba64ac677","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            if (new_state \u003d\u003d states.POWER_ON and"},{"line_number":161,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":162,"context_line":"                task.driver.storage.attach_volumes(task)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":165,"context_line":"                    task.driver.power.set_power_state).parameters):"},{"line_number":166,"context_line":"                task.driver.power.set_power_state(task, new_state,"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_06d9b27d","line":163,"updated":"2017-06-02 09:03:41.000000000","message":"As mentioned in PS25, REBOOT works as POWER_ON for a node which is already turned off. It would be better to call attach_volumes for reboot and soft reboot. attach_volumes just skips attaching if a volume is already attached.\n\nWe can move this if-statement before L157 with changing \u0027new_state\u0027 to \u0027target_state\u0027 for covering all cases where a node is turned on.","commit_id":"637c23e43c18e84ef95c849fc5dae27d65cfae1a"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"5d1f6de29ef5cd67473a0425522652452eda7eec","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            if (new_state \u003d\u003d states.POWER_ON and"},{"line_number":161,"context_line":"                    node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":162,"context_line":"                task.driver.storage.attach_volumes(task)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":165,"context_line":"                    task.driver.power.set_power_state).parameters):"},{"line_number":166,"context_line":"                task.driver.power.set_power_state(task, new_state,"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_5f1dc371","line":163,"in_reply_to":"df140735_06d9b27d","updated":"2017-06-08 13:35:21.000000000","message":"Done","commit_id":"637c23e43c18e84ef95c849fc5dae27d65cfae1a"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf2fb716db27b9062d685947b78f9c2ba64ac677","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":216,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":217,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":218,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":219,"context_line":"                node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":220,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_3d3969a3","line":218,"range":{"start_line":218,"start_character":12,"end_line":218,"end_character":21},"updated":"2017-06-02 09:03:41.000000000","message":"It should be \u0027target_state\u0027. \u0027new_state\u0027 could be POWER_OFF or SOFT_POWER_OFF.\n\n# It might be better to rename \u0027new_sate\u0027. It\u0027s a little confusing because it indicates an action.","commit_id":"637c23e43c18e84ef95c849fc5dae27d65cfae1a"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"5d1f6de29ef5cd67473a0425522652452eda7eec","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":216,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":217,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":218,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":219,"context_line":"                node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":220,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_7f188783","line":218,"range":{"start_line":218,"start_character":12,"end_line":218,"end_character":21},"in_reply_to":"df140735_3d3969a3","updated":"2017-06-08 13:35:21.000000000","message":"Done","commit_id":"637c23e43c18e84ef95c849fc5dae27d65cfae1a"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e36ac4bb0eb6477680c5e8b2ad4435af90a611a0","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":214,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"df140735_713f9387","line":216,"range":{"start_line":216,"start_character":12,"end_line":216,"end_character":21},"updated":"2017-06-07 00:35:51.000000000","message":"This should be target_state. If we use new_state, volumes aren\u0027t detached when soft power off.","commit_id":"8ea868920466a5c6e0da867a11d9bf9d0f46c829"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"2d40428b35132d19c6bca62138cd3fcfa86afe53","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":214,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"df140735_78d641c6","line":216,"range":{"start_line":216,"start_character":12,"end_line":216,"end_character":21},"in_reply_to":"df140735_713f9387","updated":"2017-06-07 12:38:02.000000000","message":"Sorry Hironori, thought I handled this already. Will update today.","commit_id":"8ea868920466a5c6e0da867a11d9bf9d0f46c829"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"ec5ef29757e976377aa455ab3e3ac7c3820c4e82","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (new_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@task_manager.require_exclusive_lock"}],"source_content_type":"text/x-python","patch_set":30,"id":"df140735_a4add0eb","line":218,"updated":"2017-06-07 16:30:57.000000000","message":"@dtantsur - I submitted an unfinished thought as a reply in PS25 sorry.\n\nYou asked if we should be taking into account if the node is in maintenance mode.\n\nI would think that we would want to treat the volumes the same way if we\u0027re in maintenance mode.\n\nAre you thinking that we should detach the volumes and leave them detached if in maintenance?","commit_id":"8ea868920466a5c6e0da867a11d9bf9d0f46c829"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"37a3fa0a47e4a84f292539fd1b14f47c405e0bb3","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    :raises: InvalidParameterValue when the wrong state is specified"},{"line_number":81,"context_line":"             or the wrong driver info is specified."},{"line_number":82,"context_line":"    :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":83,"context_line":"             wrong occurred during the power action."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":"    notify_utils.emit_power_set_notification("}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_08d11ece","line":83,"updated":"2017-06-12 19:42:29.000000000","message":"StorageError missed.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"dcc7f8fa60adfb5985a525e18ffa4a70f915d62c","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    try:"},{"line_number":157,"context_line":"        if (target_state \u003d\u003d states.POWER_ON and"},{"line_number":158,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":159,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":162,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_0b3eed28","line":159,"updated":"2017-06-09 21:13:16.000000000","message":"just curious why it is need it is only going to change state of  the volume to available?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"10e5e0c84768a8bd17b5f84d0ed6d25381b25535","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    try:"},{"line_number":157,"context_line":"        if (target_state \u003d\u003d states.POWER_ON and"},{"line_number":158,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":159,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":162,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_0085a7ad","line":159,"in_reply_to":"7f231b9d_0b3eed28","updated":"2017-06-09 22:48:19.000000000","message":"Not sure I understand the question. The specification agreed upon power cycling toggling attachments, so this facilitates that call.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"dcc7f8fa60adfb5985a525e18ffa4a70f915d62c","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":214,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (target_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_eb23b104","line":216,"updated":"2017-06-09 21:13:16.000000000","message":"To be consistent with attachment we should catch possible exceptions here and not move node to power off state if volumes were not detached or vice verse.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"37a3fa0a47e4a84f292539fd1b14f47c405e0bb3","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":214,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (target_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_5e3230f3","line":216,"in_reply_to":"7f231b9d_40715fe0","updated":"2017-06-12 19:42:29.000000000","message":"if we want to suppress exceptions than allow_errors\u003dTrue is missed in L 218","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4c35900ef9a7bbdbdd07c21d28c650f97ec36411","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":214,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (target_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_66c1c8e4","line":216,"in_reply_to":"7f231b9d_5e3230f3","updated":"2017-06-13 12:45:07.000000000","message":"That is reasonable to do imho","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":214,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (target_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_69698a89","line":216,"in_reply_to":"7f231b9d_66c1c8e4","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"10e5e0c84768a8bd17b5f84d0ed6d25381b25535","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                  \u0027new_state\u0027: new_state})"},{"line_number":214,"context_line":"        # NOTE(TheJulia): Similarly to power-on, when we power-off"},{"line_number":215,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":216,"context_line":"        if (target_state \u003d\u003d states.POWER_OFF and"},{"line_number":217,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":218,"context_line":"            task.driver.storage.detach_volumes(task)"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_40715fe0","line":216,"in_reply_to":"7f231b9d_eb23b104","updated":"2017-06-09 22:48:19.000000000","message":"I agree regarding possibly catching, or better yet, suppressing exceptions upon power-off. The one caveat is that the machine should go to power off, as the power has already been turned off.  A volume does not have to be detached when the node is powered off, it is just a \"nice thing to do\" to the storage infrastructure, and allows us to provide a means for the information to be refreshed, as there is presently no other way with the cinder api.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"984170f5fddc604955bb311e4a60c0f19571b44f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    :raises: InvalidParameterValue when the wrong state is specified"},{"line_number":81,"context_line":"             or the wrong driver info is specified."},{"line_number":82,"context_line":"    :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":83,"context_line":"             wrong occurred during the power action."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":"    notify_utils.emit_power_set_notification("}],"source_content_type":"text/x-python","patch_set":36,"id":"7f231b9d_0ccd84b7","line":83,"updated":"2017-06-13 21:31:41.000000000","message":"In the previous patchset it was mentioned that this raises StorageError.","commit_id":"751e6becb177913392ca5af1939a9063d4fd2820"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    # take power action"},{"line_number":158,"context_line":"    try:"},{"line_number":159,"context_line":"        if (target_state \u003d\u003d states.POWER_ON and"},{"line_number":160,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":161,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        if new_state !\u003d states.REBOOT:"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_2c660053","line":160,"updated":"2017-06-13 23:03:44.000000000","message":"Personal style opinion: I would prefer one more level of indentation for this line. But I know others prefer it this way :)\n\nSo basically feel free to ignore this comment.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e76f7ed764c4e038404e2604d2288d2256c9d0c3","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    # take power action"},{"line_number":158,"context_line":"    try:"},{"line_number":159,"context_line":"        if (target_state \u003d\u003d states.POWER_ON and"},{"line_number":160,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":161,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        if new_state !\u003d states.REBOOT:"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_50ce382d","line":160,"in_reply_to":"7f231b9d_2c660053","updated":"2017-06-15 12:29:33.000000000","message":"I\u0027m actually with you on that preference. The community is conflicted on that style difference at times. :(","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    # take power action"},{"line_number":158,"context_line":"    try:"},{"line_number":159,"context_line":"        if (target_state \u003d\u003d states.POWER_ON and"},{"line_number":160,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":161,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        if new_state !\u003d states.REBOOT:"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_33f506ee","line":160,"in_reply_to":"7f231b9d_50ce382d","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":218,"context_line":"        if (target_state \u003d\u003d states.POWER_OFF and"},{"line_number":219,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":220,"context_line":"            task.driver.storage.detach_volumes(task, allow_errors\u003dTrue)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"@task_manager.require_exclusive_lock"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_9963db42","line":220,"updated":"2017-06-15 13:39:06.000000000","message":"since allow_errors was internalized completely, this actually needs to be a try/catch. Changing to a generic exception catch as that is the style of the surrounding code.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ad3f511901a3a1dd516c0fd41b05a77b82ded883","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # a node, we should detach any volume attachments."},{"line_number":218,"context_line":"        if (target_state \u003d\u003d states.POWER_OFF and"},{"line_number":219,"context_line":"            node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":220,"context_line":"            task.driver.storage.detach_volumes(task, allow_errors\u003dTrue)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"@task_manager.require_exclusive_lock"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_8137d24d","line":220,"in_reply_to":"7f231b9d_9963db42","updated":"2017-06-15 20:47:15.000000000","message":"Not a fan of the generic exception, since the detach_volumes() code should only be raising StorageError","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"e9ea4ba1ec35ede722ae128b3397693fc9f6ce83","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                node.provision_state \u003d\u003d states.ACTIVE):"},{"line_number":220,"context_line":"            try:"},{"line_number":221,"context_line":"                task.driver.storage.detach_volumes(task)"},{"line_number":222,"context_line":"            except Exception as e:"},{"line_number":223,"context_line":"                LOG.warning(\"Volume detachment for node %(node)s \""},{"line_number":224,"context_line":"                            \"failed. Error: %(error)s\","},{"line_number":225,"context_line":"                            {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":38,"id":"7f231b9d_614036a6","line":222,"updated":"2017-06-15 20:47:28.000000000","message":"Not a fan of the generic exception, since the detach_volumes() code should only be raising StorageError\n\nAlso most of the generic catches are re-raising the exception.","commit_id":"05855c195be3c5d90eb27c838b022519fea783e8"}],"ironic/conf/default.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"dcc7f8fa60adfb5985a525e18ffa4a70f915d62c","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":136,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027raid\u0027)),"},{"line_number":137,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":138,"context_line":"                default\u003d[\u0027cinder\u0027, \u0027noop\u0027],"},{"line_number":139,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027default_storage_interface\u0027,"},{"line_number":141,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_2b5be92e","line":138,"range":{"start_line":138,"start_character":26,"end_line":138,"end_character":32},"updated":"2017-06-09 21:13:16.000000000","message":"this require a release note and would be good to update commit message accordingly.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"37a3fa0a47e4a84f292539fd1b14f47c405e0bb3","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":136,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027raid\u0027)),"},{"line_number":137,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":138,"context_line":"                default\u003d[\u0027cinder\u0027, \u0027noop\u0027],"},{"line_number":139,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027default_storage_interface\u0027,"},{"line_number":141,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_fe6fbcc2","line":138,"range":{"start_line":138,"start_character":26,"end_line":138,"end_character":32},"in_reply_to":"7f231b9d_205f8342","updated":"2017-06-12 19:42:29.000000000","message":"Please add mention about this change in commit message.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"10e5e0c84768a8bd17b5f84d0ed6d25381b25535","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":136,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027raid\u0027)),"},{"line_number":137,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":138,"context_line":"                default\u003d[\u0027cinder\u0027, \u0027noop\u0027],"},{"line_number":139,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027default_storage_interface\u0027,"},{"line_number":141,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_205f8342","line":138,"range":{"start_line":138,"start_character":26,"end_line":138,"end_character":32},"in_reply_to":"7f231b9d_2b5be92e","updated":"2017-06-09 22:48:19.000000000","message":"The release note is further on in the string of patches. I guess it was decided somewhere in review to change the default enabled option here.  Editing the reno just seems kind of silly, as we\u0027ve learned.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":136,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027raid\u0027)),"},{"line_number":137,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":138,"context_line":"                default\u003d[\u0027cinder\u0027, \u0027noop\u0027],"},{"line_number":139,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027default_storage_interface\u0027,"},{"line_number":141,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_c989beca","line":138,"range":{"start_line":138,"start_character":26,"end_line":138,"end_character":32},"in_reply_to":"7f231b9d_fe6fbcc2","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"}],"ironic/drivers/modules/agent.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"c4b87cb097f9099053cf421c5cc8a64a0cead63d","unresolved":false,"context_lines":[{"line_number":399,"context_line":"             wrong occurred during the power action."},{"line_number":400,"context_line":"        \"\"\""},{"line_number":401,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":402,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":403,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        return states.DELETED"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_cb825152","line":402,"range":{"start_line":402,"start_character":8,"end_line":402,"end_character":48},"updated":"2017-01-03 10:59:20.000000000","message":"Shouldn\u0027t we clear the data populated into driver_internal_info here?","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":399,"context_line":"             wrong occurred during the power action."},{"line_number":400,"context_line":"        \"\"\""},{"line_number":401,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":402,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":403,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        return states.DELETED"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_78bd6767","line":402,"range":{"start_line":402,"start_character":8,"end_line":402,"end_character":48},"in_reply_to":"ba5201f7_cb825152","updated":"2017-01-11 21:22:04.000000000","message":"We should, but not here.  We should do it higher up in the conductor.","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":14614,"name":"Kyrylo Romanenko","display_name":"K.Romanenko","email":"romanenko-kv@hotmail.com","username":"kromanenko"},"change_message_id":"e34921cf9fd9821624aa06d51c2364db662e1920","unresolved":false,"context_lines":[{"line_number":415,"context_line":"            or if new cleaning ports cannot be created."},{"line_number":416,"context_line":"        :raises: InvalidParameterValue when the wrong power state is specified"},{"line_number":417,"context_line":"             or the wrong driver info is specified for power management."},{"line_number":418,"context_line":"        :raises: StorageError If the storage driver is unable to attach the"},{"line_number":419,"context_line":"            the configured volumes."},{"line_number":420,"context_line":"        :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":421,"context_line":"             wrong occurred during the power action."},{"line_number":422,"context_line":"        :raises: exception.ImageRefValidationFailed if image_source is not"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa31d9ce_e0d729bd","line":419,"range":{"start_line":418,"start_character":72,"end_line":419,"end_character":15},"updated":"2017-02-17 14:22:39.000000000","message":"Too many `the`","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"a356f0b1281a039c6ba30d7a7101f14694364f2b","unresolved":false,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        node \u003d task.node"},{"line_number":342,"context_line":"        params \u003d {}"},{"line_number":343,"context_line":"        image_source \u003d node.instance_info.get(\u0027image_source\u0027)"},{"line_number":344,"context_line":"        params[\u0027instance_info.image_source\u0027] \u003d image_source"},{"line_number":345,"context_line":"        error_msg \u003d _(\u0027Node %s failed to validate deploy image info. Some \u0027"},{"line_number":346,"context_line":"                      \u0027parameters were missing\u0027) % node.uuid"}],"source_content_type":"text/x-python","patch_set":18,"id":"ffe62b97_dff477f3","line":343,"updated":"2017-03-29 14:03:16.000000000","message":"In case of boot from volume, image_source is not necessary when task.driver.storage.should_write_image() returns False. We need to skip this validation.\n\nI\u0027m not sure if this fix should be in this patch. It seems necessary to skip image validation in more places. It might be better to do it in another patch.","commit_id":"94fae07e49b096856490957d7d87177561c757ec"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69ff415fd0c73185c9bbbe9633da18b8f2d6c776","unresolved":false,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        node \u003d task.node"},{"line_number":342,"context_line":"        params \u003d {}"},{"line_number":343,"context_line":"        image_source \u003d node.instance_info.get(\u0027image_source\u0027)"},{"line_number":344,"context_line":"        params[\u0027instance_info.image_source\u0027] \u003d image_source"},{"line_number":345,"context_line":"        error_msg \u003d _(\u0027Node %s failed to validate deploy image info. Some \u0027"},{"line_number":346,"context_line":"                      \u0027parameters were missing\u0027) % node.uuid"}],"source_content_type":"text/x-python","patch_set":18,"id":"ffe62b97_5c360e53","line":343,"in_reply_to":"ffe62b97_dff477f3","updated":"2017-03-29 19:52:01.000000000","message":"+1 to doing in another patch as doing so would then be cleaner.  That does kind of make should_write_image()\u0027s logic nice and clean though :)","commit_id":"94fae07e49b096856490957d7d87177561c757ec"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e588acc59623d09f571cf8a84058b4f1d8df40b6","unresolved":false,"context_lines":[{"line_number":399,"context_line":"             wrong occurred during the power action."},{"line_number":400,"context_line":"        \"\"\""},{"line_number":401,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":402,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":403,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":404,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":405,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a1ced50_514ee36f","line":402,"updated":"2017-03-20 18:10:56.000000000","message":"Is it possible to move this to the conductor? Eg, detach volumes before powering off and unconfigure_tenant_networks? I\u0027m planning to move the network interface stuff to conductor, to make sure that we do what we suppose we should be doing, even in case of out of tree deploy drivers. It will also enable any of those to make use of multitenancy without inserting this stuff in a bunch of places.","commit_id":"94fae07e49b096856490957d7d87177561c757ec"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69ff415fd0c73185c9bbbe9633da18b8f2d6c776","unresolved":false,"context_lines":[{"line_number":399,"context_line":"             wrong occurred during the power action."},{"line_number":400,"context_line":"        \"\"\""},{"line_number":401,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":402,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":403,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":404,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":405,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"ffe62b97_bc087a91","line":402,"in_reply_to":"1a1ced50_514ee36f","updated":"2017-03-29 19:52:01.000000000","message":"I think it is viable to do.  When are you thinking of doing that work?  It would seem like something that could be impacting of any third party drivers that have their own network wiring already, so likely that would need to be announced well in advance of the actual change being pushed through.","commit_id":"94fae07e49b096856490957d7d87177561c757ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"86fd0fa9d3cb27c578c189adba3bbc25752d184d","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":397,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":398,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        return states.DELETED"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_f42aaa7c","line":397,"updated":"2017-05-24 12:21:25.000000000","message":"this does not look like a right place to put storage actions. this is completely deploy-agnostic, and I wonder if we should move these calls up one level to the conductor.","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6fb5bc2ab8bf78a5957b9c62ffca6ca8d3ac38e8","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":397,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":398,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        return states.DELETED"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_7d74139d","line":397,"in_reply_to":"ff0f0b1f_f42aaa7c","updated":"2017-05-25 15:30:09.000000000","message":"+1, we should look into this.","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"86fd0fa9d3cb27c578c189adba3bbc25752d184d","unresolved":false,"context_lines":[{"line_number":428,"context_line":"            task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":429,"context_line":"            task.driver.network.add_provisioning_network(task)"},{"line_number":430,"context_line":"            # Signal to storage driver to attach volumes"},{"line_number":431,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":432,"context_line":"        if node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":433,"context_line":"            task.driver.boot.prepare_instance(task)"},{"line_number":434,"context_line":"        elif node.provision_state !\u003d states.ADOPTING:"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_d42d6695","line":431,"updated":"2017-05-24 12:21:25.000000000","message":"essentially, the same comment goes here. this does not depend on deploy, maybe move it one level up?","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"37a3fa0a47e4a84f292539fd1b14f47c405e0bb3","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        :raises: InvalidParameterValue when the wrong power state is specified"},{"line_number":391,"context_line":"             or the wrong driver info is specified for power management."},{"line_number":392,"context_line":"        :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":393,"context_line":"             wrong occurred during the power action."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_43bed765","line":393,"updated":"2017-06-12 19:42:29.000000000","message":"missed raises StorageError","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        :raises: InvalidParameterValue when the wrong power state is specified"},{"line_number":391,"context_line":"             or the wrong driver info is specified for power management."},{"line_number":392,"context_line":"        :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":393,"context_line":"             wrong occurred during the power action."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_e9b59ace","line":393,"in_reply_to":"7f231b9d_43bed765","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"dcc7f8fa60adfb5985a525e18ffa4a70f915d62c","unresolved":false,"context_lines":[{"line_number":393,"context_line":"             wrong occurred during the power action."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":397,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":398,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":399,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_eb517164","line":396,"updated":"2017-06-09 21:13:16.000000000","message":"we already detached volume when did power_off  do we need to call this here second time? https://review.openstack.org/#/c/406290/35/ironic/conductor/utils.py@216","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4c35900ef9a7bbdbdd07c21d28c650f97ec36411","unresolved":false,"context_lines":[{"line_number":393,"context_line":"             wrong occurred during the power action."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":397,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":398,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":399,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_8663c41a","line":396,"in_reply_to":"7f231b9d_03469f7d","updated":"2017-06-13 12:45:07.000000000","message":"Ahh, but I\u0027ve interpreted your comment as doing so there.  As such, this seems like a non-issue.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"37a3fa0a47e4a84f292539fd1b14f47c405e0bb3","unresolved":false,"context_lines":[{"line_number":393,"context_line":"             wrong occurred during the power action."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":397,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":398,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":399,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_03469f7d","line":396,"in_reply_to":"7f231b9d_803537fa","updated":"2017-06-12 19:42:29.000000000","message":"We do not suppress failures there https://review.openstack.org/#/c/406290/35/ironic/conductor/utils.py@218","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"10e5e0c84768a8bd17b5f84d0ed6d25381b25535","unresolved":false,"context_lines":[{"line_number":393,"context_line":"             wrong occurred during the power action."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":396,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":397,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":398,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":399,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_803537fa","line":396,"in_reply_to":"7f231b9d_eb517164","updated":"2017-06-09 22:48:19.000000000","message":"Great question. If we suppress a failure there, then we would still need to prevent a teardown here...  So it kind of actually makes sense to call twice since it should reconcile if memory serves.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"dcc7f8fa60adfb5985a525e18ffa4a70f915d62c","unresolved":false,"context_lines":[{"line_number":428,"context_line":"            task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":429,"context_line":"            task.driver.network.add_provisioning_network(task)"},{"line_number":430,"context_line":"            # Signal to storage driver to attach volumes"},{"line_number":431,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":432,"context_line":"        if node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":433,"context_line":"            task.driver.boot.prepare_instance(task)"},{"line_number":434,"context_line":"        elif node.provision_state !\u003d states.ADOPTING:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_4b3aa5e7","line":431,"updated":"2017-06-09 21:13:16.000000000","message":"we may get situation here when volume is attached but we failed deployment it will confuse. Shouldn\u0027t we move this attach_volumes after L433?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"10e5e0c84768a8bd17b5f84d0ed6d25381b25535","unresolved":false,"context_lines":[{"line_number":428,"context_line":"            task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":429,"context_line":"            task.driver.network.add_provisioning_network(task)"},{"line_number":430,"context_line":"            # Signal to storage driver to attach volumes"},{"line_number":431,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":432,"context_line":"        if node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":433,"context_line":"            task.driver.boot.prepare_instance(task)"},{"line_number":434,"context_line":"        elif node.provision_state !\u003d states.ADOPTING:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_c02a0f8f","line":431,"in_reply_to":"7f231b9d_4b3aa5e7","updated":"2017-06-09 22:48:19.000000000","message":"No, L433 should only be called upon conductor takeover.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"37a3fa0a47e4a84f292539fd1b14f47c405e0bb3","unresolved":false,"context_lines":[{"line_number":428,"context_line":"            task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":429,"context_line":"            task.driver.network.add_provisioning_network(task)"},{"line_number":430,"context_line":"            # Signal to storage driver to attach volumes"},{"line_number":431,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":432,"context_line":"        if node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":433,"context_line":"            task.driver.boot.prepare_instance(task)"},{"line_number":434,"context_line":"        elif node.provision_state !\u003d states.ADOPTING:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_fe08dc28","line":431,"in_reply_to":"7f231b9d_c02a0f8f","updated":"2017-06-12 19:42:29.000000000","message":"right, missed that.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4c35900ef9a7bbdbdd07c21d28c650f97ec36411","unresolved":false,"context_lines":[{"line_number":428,"context_line":"            task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":429,"context_line":"            task.driver.network.add_provisioning_network(task)"},{"line_number":430,"context_line":"            # Signal to storage driver to attach volumes"},{"line_number":431,"context_line":"            task.driver.storage.attach_volumes(task)"},{"line_number":432,"context_line":"        if node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":433,"context_line":"            task.driver.boot.prepare_instance(task)"},{"line_number":434,"context_line":"        elif node.provision_state !\u003d states.ADOPTING:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_466dac02","line":431,"in_reply_to":"7f231b9d_fe08dc28","updated":"2017-06-13 12:45:07.000000000","message":"No worries!  This is confusing code to keep track of :)","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"}],"ironic/drivers/modules/deploy_utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"32e0d5797760df68fa77948645e5ee3840367589","unresolved":false,"context_lines":[{"line_number":1206,"context_line":""},{"line_number":1207,"context_line":"    :returns: True if capability found, otherwise False."},{"line_number":1208,"context_line":"    \"\"\""},{"line_number":1209,"context_line":"    if hasattr(driver, \u0027capabilities\u0027):"},{"line_number":1210,"context_line":"        if capability in driver.capabilities:"},{"line_number":1211,"context_line":"            return True"},{"line_number":1212,"context_line":"    return False"},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":""},{"line_number":1215,"context_line":"def return_remote_boot_volume(task):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_37ad799b","line":1212,"range":{"start_line":1209,"start_character":0,"end_line":1212,"end_character":16},"updated":"2016-12-12 14:44:48.000000000","message":"nit:\n\n return capability in getattr(driver, \u0027capabilities\u0027, {})","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a24a4ed40f5e5c53eb35dac16d26e4baa59fe908","unresolved":false,"context_lines":[{"line_number":1206,"context_line":""},{"line_number":1207,"context_line":"    :returns: True if capability found, otherwise False."},{"line_number":1208,"context_line":"    \"\"\""},{"line_number":1209,"context_line":"    if hasattr(driver, \u0027capabilities\u0027):"},{"line_number":1210,"context_line":"        if capability in driver.capabilities:"},{"line_number":1211,"context_line":"            return True"},{"line_number":1212,"context_line":"    return False"},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":""},{"line_number":1215,"context_line":"def return_remote_boot_volume(task):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_aaa729a5","line":1212,"range":{"start_line":1209,"start_character":0,"end_line":1212,"end_character":16},"in_reply_to":"3a71b18c_37ad799b","updated":"2016-12-16 21:59:56.000000000","message":"Done","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"32e0d5797760df68fa77948645e5ee3840367589","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"    for volume in targets:"},{"line_number":1222,"context_line":"        if volume[\u0027boot_index\u0027] \u003d\u003d 0:"},{"line_number":1223,"context_line":"            return volume"},{"line_number":1224,"context_line":"    return None"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def identify_storage_driver_internal_info(task):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_979c8d6b","line":1224,"range":{"start_line":1224,"start_character":0,"end_line":1224,"end_character":15},"updated":"2016-12-12 14:44:48.000000000","message":"nit: redundant instruction","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a24a4ed40f5e5c53eb35dac16d26e4baa59fe908","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"    for volume in targets:"},{"line_number":1222,"context_line":"        if volume[\u0027boot_index\u0027] \u003d\u003d 0:"},{"line_number":1223,"context_line":"            return volume"},{"line_number":1224,"context_line":"    return None"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def identify_storage_driver_internal_info(task):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_ca8aa51a","line":1224,"range":{"start_line":1224,"start_character":0,"end_line":1224,"end_character":15},"in_reply_to":"3a71b18c_979c8d6b","updated":"2016-12-16 21:59:56.000000000","message":"Done","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"32e0d5797760df68fa77948645e5ee3840367589","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"    return None"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def identify_storage_driver_internal_info(task):"},{"line_number":1228,"context_line":"    \"\"\"Set node driver_internal_info for boot from volume parameters.\"\"\""},{"line_number":1229,"context_line":"    node \u003d task.node"},{"line_number":1230,"context_line":"    if \u0027noop\u0027 not in node.storage_interface:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_d788c524","line":1227,"range":{"start_line":1227,"start_character":4,"end_line":1227,"end_character":12},"updated":"2016-12-12 14:44:48.000000000","message":"s/identify/populate/ maybe?","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a24a4ed40f5e5c53eb35dac16d26e4baa59fe908","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"    return None"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def identify_storage_driver_internal_info(task):"},{"line_number":1228,"context_line":"    \"\"\"Set node driver_internal_info for boot from volume parameters.\"\"\""},{"line_number":1229,"context_line":"    node \u003d task.node"},{"line_number":1230,"context_line":"    if \u0027noop\u0027 not in node.storage_interface:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_8a750d33","line":1227,"range":{"start_line":1227,"start_character":4,"end_line":1227,"end_character":12},"in_reply_to":"3a71b18c_d788c524","updated":"2016-12-16 21:59:56.000000000","message":"Done","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"32e0d5797760df68fa77948645e5ee3840367589","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"def identify_storage_driver_internal_info(task):"},{"line_number":1228,"context_line":"    \"\"\"Set node driver_internal_info for boot from volume parameters.\"\"\""},{"line_number":1229,"context_line":"    node \u003d task.node"},{"line_number":1230,"context_line":"    if \u0027noop\u0027 not in node.storage_interface:"},{"line_number":1231,"context_line":"        boot_volume \u003d return_remote_boot_volume(task)"},{"line_number":1232,"context_line":"        vol_type \u003d boot_volume[\u0027volume_type\u0027] or None"},{"line_number":1233,"context_line":"        if boot_volume and vol_type:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_57cf557e","line":1230,"range":{"start_line":1230,"start_character":7,"end_line":1230,"end_character":43},"updated":"2016-12-12 14:44:48.000000000","message":"I don\u0027t quite like hardcoding the name here. Should we maybe create a helper property node.storage_interface.is_noop?\n\nalso, does it hurt if we do these actions for all drivers? seems just like some strings wrangling.","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a24a4ed40f5e5c53eb35dac16d26e4baa59fe908","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"def identify_storage_driver_internal_info(task):"},{"line_number":1228,"context_line":"    \"\"\"Set node driver_internal_info for boot from volume parameters.\"\"\""},{"line_number":1229,"context_line":"    node \u003d task.node"},{"line_number":1230,"context_line":"    if \u0027noop\u0027 not in node.storage_interface:"},{"line_number":1231,"context_line":"        boot_volume \u003d return_remote_boot_volume(task)"},{"line_number":1232,"context_line":"        vol_type \u003d boot_volume[\u0027volume_type\u0027] or None"},{"line_number":1233,"context_line":"        if boot_volume and vol_type:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_6aa19193","line":1230,"range":{"start_line":1230,"start_character":7,"end_line":1230,"end_character":43},"in_reply_to":"3a71b18c_57cf557e","updated":"2016-12-16 21:59:56.000000000","message":"The strings/formatting should be fine for all drivers that may implement a storage interface.  The hardcoding of noop is something that I need to ponder to make sure we\u0027re not trying to do things when we shouldn\u0027t.","commit_id":"6dbebf4a73439b3eae898c4fbd6c6abd75c06ad2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"81bae219bc9d032b0cec7fda83ba1f085145047a","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"def populate_storage_driver_internal_info(task):"},{"line_number":1220,"context_line":"    \"\"\"Set node driver_internal_info for boot from volume parameters.\"\"\""},{"line_number":1221,"context_line":"    node \u003d task.node"},{"line_number":1222,"context_line":"    if \u0027noop\u0027 not in node.storage_interface:"},{"line_number":1223,"context_line":"        boot_volume \u003d return_remote_boot_volume(task)"},{"line_number":1224,"context_line":"        vol_type \u003d boot_volume[\u0027volume_type\u0027] or None"},{"line_number":1225,"context_line":"        if boot_volume and vol_type:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a6eadb0_29b63edc","line":1222,"updated":"2016-12-21 01:40:33.000000000","message":"We actually don\u0027t need to check this.  As long as we check the capabilities as defined in properties/capabilities to indicate if the node supports it at all.","commit_id":"579bd63043eed326296ffab0dabbda4288993c75"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"81bae219bc9d032b0cec7fda83ba1f085145047a","unresolved":false,"context_lines":[{"line_number":1222,"context_line":"    if \u0027noop\u0027 not in node.storage_interface:"},{"line_number":1223,"context_line":"        boot_volume \u003d return_remote_boot_volume(task)"},{"line_number":1224,"context_line":"        vol_type \u003d boot_volume[\u0027volume_type\u0027] or None"},{"line_number":1225,"context_line":"        if boot_volume and vol_type:"},{"line_number":1226,"context_line":"            boot_capability \u003d (\"%s_volume_boot\" % vol_type.lower())"},{"line_number":1227,"context_line":"            deploy_capability \u003d (\"%s_volume_deploy\" % vol_type.lower())"},{"line_number":1228,"context_line":"            vol_uuid \u003d boot_volume[\u0027uuid\u0027] or None"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a6eadb0_09d7c2ed","line":1225,"updated":"2016-12-21 01:40:33.000000000","message":"if not boot_volume or not vol_type ?\n\nand/or incorporate the properties check since we can\u0027t actually assert it based upon the capability.","commit_id":"579bd63043eed326296ffab0dabbda4288993c75"},{"author":{"_account_id":10453,"name":"octopuszhang","email":"zhangyf@rc.inesa.com","username":"1"},"change_message_id":"82f395a9e9bb7bbbe8b73c86076ad73b75bdf0b7","unresolved":false,"context_lines":[{"line_number":1204,"context_line":""},{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"def return_remote_boot_volume(task):"},{"line_number":1207,"context_line":"    \"\"\"Identify a boot from volume root volume."},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":"    :returns: None or the volume target representing the volume."},{"line_number":1210,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_3cbb4f74","line":1207,"range":{"start_line":1207,"start_character":7,"end_line":1207,"end_character":47},"updated":"2016-12-30 09:00:47.000000000","message":"This sentence is confusing, do you mean \u0027Identify the boot source  volume from all remote volumes if exist\u0027?","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":1204,"context_line":""},{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"def return_remote_boot_volume(task):"},{"line_number":1207,"context_line":"    \"\"\"Identify a boot from volume root volume."},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":"    :returns: None or the volume target representing the volume."},{"line_number":1210,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_fb96b14a","line":1207,"range":{"start_line":1207,"start_character":7,"end_line":1207,"end_character":47},"in_reply_to":"ba5201f7_3cbb4f74","updated":"2017-01-11 21:22:04.000000000","message":"Identify any volume that is a root or boot volume per the data provided from cinder.\n\nRewording.","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":10453,"name":"octopuszhang","email":"zhangyf@rc.inesa.com","username":"1"},"change_message_id":"8b03c0d495e62384d155f063e2f0edfd72a3450c","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"    if boot_volume:"},{"line_number":1225,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1226,"context_line":"    if boot_volume and vol_type:"},{"line_number":1227,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1228,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1229,"context_line":"            # some additional logic will be needed here to ensure we align."},{"line_number":1230,"context_line":"            # The deployment in theory should never reach a point such as this,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_094d6c72","line":1227,"range":{"start_line":1227,"start_character":13,"end_line":1227,"end_character":18},"updated":"2016-12-30 09:10:53.000000000","message":"Does this mean that, If I want to use this fuction, I must confgured the related volume type with name \u0027%iscsi%\u0027?","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"c4b87cb097f9099053cf421c5cc8a64a0cead63d","unresolved":false,"context_lines":[{"line_number":1223,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1224,"context_line":"    if boot_volume:"},{"line_number":1225,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1226,"context_line":"    if boot_volume and vol_type:"},{"line_number":1227,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1228,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1229,"context_line":"            # some additional logic will be needed here to ensure we align."},{"line_number":1230,"context_line":"            # The deployment in theory should never reach a point such as this,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_8b1e8961","line":1227,"range":{"start_line":1226,"start_character":4,"end_line":1227,"end_character":34},"updated":"2017-01-03 10:59:20.000000000","message":"These 2 can be clubbed together:-\n if boot_volume:\n     vol_type \u003d boot_volume.volume_type\n     if (vol_type and (\u0027iscsi\u0027 not in vol_type ...))\n         return","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"    if boot_volume:"},{"line_number":1225,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1226,"context_line":"    if boot_volume and vol_type:"},{"line_number":1227,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1228,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1229,"context_line":"            # some additional logic will be needed here to ensure we align."},{"line_number":1230,"context_line":"            # The deployment in theory should never reach a point such as this,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_db0e4d8b","line":1227,"range":{"start_line":1227,"start_character":13,"end_line":1227,"end_character":18},"in_reply_to":"ba5201f7_094d6c72","updated":"2017-01-11 21:22:04.000000000","message":"Yes, the basis being volume connection information.  The names per the information are somewhat strict, there is a note in the prior patch regarding where we should actually be getting that name, the volume_driver_type if available, not the actual cinder native volume_type field since ironic went for a generic data storage framework.","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":1223,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1224,"context_line":"    if boot_volume:"},{"line_number":1225,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1226,"context_line":"    if boot_volume and vol_type:"},{"line_number":1227,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1228,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1229,"context_line":"            # some additional logic will be needed here to ensure we align."},{"line_number":1230,"context_line":"            # The deployment in theory should never reach a point such as this,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_c67034a7","line":1227,"range":{"start_line":1226,"start_character":4,"end_line":1227,"end_character":34},"in_reply_to":"ba5201f7_8b1e8961","updated":"2017-01-11 21:22:04.000000000","message":"Done","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":10453,"name":"octopuszhang","email":"zhangyf@rc.inesa.com","username":"1"},"change_message_id":"82f395a9e9bb7bbbe8b73c86076ad73b75bdf0b7","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"            return"},{"line_number":1236,"context_line":"        boot_capability \u003d (\"%s_volume_boot\" % vol_type.lower())"},{"line_number":1237,"context_line":"        deploy_capability \u003d (\"%s_volume_deploy\" % vol_type.lower())"},{"line_number":1238,"context_line":"        vol_uuid \u003d boot_volume[\u0027uuid\u0027] or None"},{"line_number":1239,"context_line":"        if check_capability(task.driver.boot, boot_capability):"},{"line_number":1240,"context_line":"            node.driver_internal_info[\u0027boot_from_volume\u0027] \u003d vol_uuid"},{"line_number":1241,"context_line":"        # NOTE(TheJulia): This would be a convient place to check"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_77097031","line":1238,"range":{"start_line":1238,"start_character":39,"end_line":1238,"end_character":46},"updated":"2016-12-30 09:00:47.000000000","message":"what does \u0027or None\u0027 mean here, avoid vol_uuid to be \u0027\u0027?","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"c4b87cb097f9099053cf421c5cc8a64a0cead63d","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"            return"},{"line_number":1236,"context_line":"        boot_capability \u003d (\"%s_volume_boot\" % vol_type.lower())"},{"line_number":1237,"context_line":"        deploy_capability \u003d (\"%s_volume_deploy\" % vol_type.lower())"},{"line_number":1238,"context_line":"        vol_uuid \u003d boot_volume[\u0027uuid\u0027] or None"},{"line_number":1239,"context_line":"        if check_capability(task.driver.boot, boot_capability):"},{"line_number":1240,"context_line":"            node.driver_internal_info[\u0027boot_from_volume\u0027] \u003d vol_uuid"},{"line_number":1241,"context_line":"        # NOTE(TheJulia): This would be a convient place to check"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_8b35a9db","line":1238,"range":{"start_line":1238,"start_character":39,"end_line":1238,"end_character":46},"in_reply_to":"ba5201f7_77097031","updated":"2017-01-03 10:59:20.000000000","message":"++","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"            return"},{"line_number":1236,"context_line":"        boot_capability \u003d (\"%s_volume_boot\" % vol_type.lower())"},{"line_number":1237,"context_line":"        deploy_capability \u003d (\"%s_volume_deploy\" % vol_type.lower())"},{"line_number":1238,"context_line":"        vol_uuid \u003d boot_volume[\u0027uuid\u0027] or None"},{"line_number":1239,"context_line":"        if check_capability(task.driver.boot, boot_capability):"},{"line_number":1240,"context_line":"            node.driver_internal_info[\u0027boot_from_volume\u0027] \u003d vol_uuid"},{"line_number":1241,"context_line":"        # NOTE(TheJulia): This would be a convient place to check"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_86d62c4d","line":1238,"range":{"start_line":1238,"start_character":39,"end_line":1238,"end_character":46},"in_reply_to":"ba5201f7_77097031","updated":"2017-01-11 21:22:04.000000000","message":"Artifact of an earlier revision, it should always be populated at this point, removing.","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":10453,"name":"octopuszhang","email":"zhangyf@rc.inesa.com","username":"1"},"change_message_id":"8b03c0d495e62384d155f063e2f0edfd72a3450c","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"        if (check_capability(task.driver.deploy, deploy_capability) and"},{"line_number":1244,"context_line":"                task.driver.storage.should_write_image(task)):"},{"line_number":1245,"context_line":"            node.driver_internal_info[\u0027boot_from_volume_deploy\u0027] \u003d vol_uuid"},{"line_number":1246,"context_line":"            # NOTE(Thejulia): This is also a useful place to include a"},{"line_number":1247,"context_line":"            # root device hint since we should/might/be able to obtain"},{"line_number":1248,"context_line":"            # and supply that information to IPA if it needs to write"},{"line_number":1249,"context_line":"            # the image to the volume."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_09e9ec1a","line":1246,"range":{"start_line":1246,"start_character":12,"end_line":1246,"end_character":13},"updated":"2016-12-30 09:10:53.000000000","message":"So cinder create a empty volume, nova create a baremetal instance boot from that volume and from a specified image, conductor tell the IPA to write cinder volume here. Do I misunderstand? This is a pretty special case...","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"        if (check_capability(task.driver.deploy, deploy_capability) and"},{"line_number":1244,"context_line":"                task.driver.storage.should_write_image(task)):"},{"line_number":1245,"context_line":"            node.driver_internal_info[\u0027boot_from_volume_deploy\u0027] \u003d vol_uuid"},{"line_number":1246,"context_line":"            # NOTE(Thejulia): This is also a useful place to include a"},{"line_number":1247,"context_line":"            # root device hint since we should/might/be able to obtain"},{"line_number":1248,"context_line":"            # and supply that information to IPA if it needs to write"},{"line_number":1249,"context_line":"            # the image to the volume."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_bb5429fe","line":1246,"range":{"start_line":1246,"start_character":12,"end_line":1246,"end_character":13},"in_reply_to":"ba5201f7_09e9ec1a","updated":"2017-01-11 21:22:04.000000000","message":"I think you\u0027ve got it.  Possible if an instance is defined I guess from a pre-existing blank volume.","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"44f7a4cb3d9cee43e7a5ccc83bb14327806f6776","unresolved":false,"context_lines":[{"line_number":1202,"context_line":"    return instance_info"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":""},{"line_number":1205,"context_line":"def check_capability(driver, capability):"},{"line_number":1206,"context_line":"    \"\"\"Evaluate driver to determine if capability is present."},{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    :returns: True if capability found, otherwise False."}],"source_content_type":"text/x-python","patch_set":10,"id":"7a3c09a3_9f5d7549","line":1205,"updated":"2017-01-17 17:02:27.000000000","message":"let\u0027s call it check_driver_capability, we have too many various capabilities already..","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"232e4c8f78a1ce74dcc65d2736730f71d790fcfb","unresolved":false,"context_lines":[{"line_number":1202,"context_line":"    return instance_info"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":""},{"line_number":1205,"context_line":"def check_capability(driver, capability):"},{"line_number":1206,"context_line":"    \"\"\"Evaluate driver to determine if capability is present."},{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    :returns: True if capability found, otherwise False."}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_8b2458c5","line":1205,"in_reply_to":"7a3c09a3_9f5d7549","updated":"2017-02-14 21:46:11.000000000","message":"Renamed to check_interface_capability, since it should be operating on that level.... and then is re-usable. :)","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"44f7a4cb3d9cee43e7a5ccc83bb14327806f6776","unresolved":false,"context_lines":[{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    :returns: True if capability found, otherwise False."},{"line_number":1209,"context_line":"    \"\"\""},{"line_number":1210,"context_line":"    return capability in getattr(driver, \u0027capabilities\u0027, {})"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"def return_remote_boot_volume(task):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a3c09a3_bf56b127","line":1210,"updated":"2017-01-17 17:02:27.000000000","message":"what\u0027s the type of driver.capabilities? is it a dict (with what values?) or a set (then {} is incorrect).","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"232e4c8f78a1ce74dcc65d2736730f71d790fcfb","unresolved":false,"context_lines":[{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    :returns: True if capability found, otherwise False."},{"line_number":1209,"context_line":"    \"\"\""},{"line_number":1210,"context_line":"    return capability in getattr(driver, \u0027capabilities\u0027, {})"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"def return_remote_boot_volume(task):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_cb01f007","line":1210,"in_reply_to":"7a3c09a3_bf56b127","updated":"2017-02-14 21:46:11.000000000","message":"Yup, that is wrong, it should be a list.","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"44f7a4cb3d9cee43e7a5ccc83bb14327806f6776","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"    return capability in getattr(driver, \u0027capabilities\u0027, {})"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"def return_remote_boot_volume(task):"},{"line_number":1214,"context_line":"    \"\"\"Identify a boot volume from any configured volumes."},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"    :returns: None or the volume target representing the volume."}],"source_content_type":"text/x-python","patch_set":10,"id":"7a3c09a3_df537d37","line":1213,"updated":"2017-01-17 17:02:27.000000000","message":"s/return/get/","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"232e4c8f78a1ce74dcc65d2736730f71d790fcfb","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"    return capability in getattr(driver, \u0027capabilities\u0027, {})"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"def return_remote_boot_volume(task):"},{"line_number":1214,"context_line":"    \"\"\"Identify a boot volume from any configured volumes."},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"    :returns: None or the volume target representing the volume."}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_0ed7964b","line":1213,"in_reply_to":"7a3c09a3_df537d37","updated":"2017-02-14 21:46:11.000000000","message":"Done","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"44f7a4cb3d9cee43e7a5ccc83bb14327806f6776","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"    vol_type \u003d None"},{"line_number":1229,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1230,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1231,"context_line":"    if boot_volume:"},{"line_number":1232,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1233,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1234,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a3c09a3_ff32f90e","line":1231,"updated":"2017-01-17 17:02:27.000000000","message":"to reduce indentation:\n\n if not boot_volume:\n   return\n\n(you can even move it to after line 1227)","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"232e4c8f78a1ce74dcc65d2736730f71d790fcfb","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"    vol_type \u003d None"},{"line_number":1229,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1230,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1231,"context_line":"    if boot_volume:"},{"line_number":1232,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1233,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1234,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_0e0cf6eb","line":1231,"in_reply_to":"7a3c09a3_ff32f90e","updated":"2017-02-14 21:46:11.000000000","message":"Done","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"44f7a4cb3d9cee43e7a5ccc83bb14327806f6776","unresolved":false,"context_lines":[{"line_number":1230,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1231,"context_line":"    if boot_volume:"},{"line_number":1232,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1233,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1234,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1235,"context_line":"            # some additional logic will be needed here to ensure we align."},{"line_number":1236,"context_line":"            # The deployment, in theory, should never reach this point"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a3c09a3_1f38a5ee","line":1233,"updated":"2017-01-17 17:02:27.000000000","message":"nit: redundant brackets\n\nalso the same question as in the previous patch about the type of volume_type.","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"232e4c8f78a1ce74dcc65d2736730f71d790fcfb","unresolved":false,"context_lines":[{"line_number":1230,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1231,"context_line":"    if boot_volume:"},{"line_number":1232,"context_line":"        vol_type \u003d boot_volume.volume_type"},{"line_number":1233,"context_line":"        if (\u0027iscsi\u0027 not in vol_type and \u0027iscsi_boot\u0027 not in node_caps):"},{"line_number":1234,"context_line":"            # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1235,"context_line":"            # some additional logic will be needed here to ensure we align."},{"line_number":1236,"context_line":"            # The deployment, in theory, should never reach this point"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_eed40221","line":1233,"in_reply_to":"7a3c09a3_1f38a5ee","updated":"2017-02-14 21:46:11.000000000","message":"Done","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"44f7a4cb3d9cee43e7a5ccc83bb14327806f6776","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"            # as the only guard against bad configurations."},{"line_number":1239,"context_line":"            return"},{"line_number":1240,"context_line":"            # TODO(TheJulia): This may be better if we raise an exception since"},{"line_number":1241,"context_line":"            # we seem to have conflicting data, at least in ironic."},{"line_number":1242,"context_line":"        boot_capability \u003d (\"%s_volume_boot\" % vol_type.lower())"},{"line_number":1243,"context_line":"        deploy_capability \u003d (\"%s_volume_deploy\" % vol_type.lower())"},{"line_number":1244,"context_line":"        vol_uuid \u003d boot_volume[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a3c09a3_3f39e1f2","line":1241,"updated":"2017-01-17 17:02:27.000000000","message":"so, should we? let\u0027s have at least LOG.warning here","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"232e4c8f78a1ce74dcc65d2736730f71d790fcfb","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"            # as the only guard against bad configurations."},{"line_number":1239,"context_line":"            return"},{"line_number":1240,"context_line":"            # TODO(TheJulia): This may be better if we raise an exception since"},{"line_number":1241,"context_line":"            # we seem to have conflicting data, at least in ironic."},{"line_number":1242,"context_line":"        boot_capability \u003d (\"%s_volume_boot\" % vol_type.lower())"},{"line_number":1243,"context_line":"        deploy_capability \u003d (\"%s_volume_deploy\" % vol_type.lower())"},{"line_number":1244,"context_line":"        vol_uuid \u003d boot_volume[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_6e973248","line":1241,"in_reply_to":"7a3c09a3_3f39e1f2","updated":"2017-02-14 21:46:11.000000000","message":"Raise an exception, a node _should_ never get past validation to this point (if memory serves.... and as my TODO note indicates), so I think a warning is best.","commit_id":"7ea111ae492a49ed92f392315db7759110b2ffd2"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"de5f4abe4dc761647060f293ad798a5b26cb2605","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"        # The deployment, in theory, should never reach this point"},{"line_number":1252,"context_line":"        # if the interfaces all validated, but we shouldn\u0027t use that"},{"line_number":1253,"context_line":"        # as the only guard against bad configurations."},{"line_number":1254,"context_line":"        LOG.warning(_LW(\u0027Node %(node)s has an iscsi boot volume defined \u0027"},{"line_number":1255,"context_line":"                        \u0027and no boot support available.\u0027),"},{"line_number":1256,"context_line":"                    {\u0027node\u0027: node.uuid})"},{"line_number":1257,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":15,"id":"da36d5c6_f4c63315","line":1254,"range":{"start_line":1254,"start_character":8,"end_line":1254,"end_character":20},"updated":"2017-02-20 09:39:09.000000000","message":"Instead of warning, would it be better to throw exception here and fail early? Anyways it would fail later point of when it attempts booting from volume.","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ec735b5cc58d3f4bebfc3ab5fb039cca6ba24f3f","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"        # The deployment, in theory, should never reach this point"},{"line_number":1252,"context_line":"        # if the interfaces all validated, but we shouldn\u0027t use that"},{"line_number":1253,"context_line":"        # as the only guard against bad configurations."},{"line_number":1254,"context_line":"        LOG.warning(_LW(\u0027Node %(node)s has an iscsi boot volume defined \u0027"},{"line_number":1255,"context_line":"                        \u0027and no boot support available.\u0027),"},{"line_number":1256,"context_line":"                    {\u0027node\u0027: node.uuid})"},{"line_number":1257,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a1ff146_574ed76f","line":1254,"range":{"start_line":1254,"start_character":8,"end_line":1254,"end_character":20},"in_reply_to":"da36d5c6_f4c63315","updated":"2017-03-16 15:17:16.000000000","message":"That makes sense.  If storage validation is read by nova (which I just commented on the nova patch about adding that), then we realistically should never get here, but we likely ought to ail anyway.","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"de5f4abe4dc761647060f293ad798a5b26cb2605","unresolved":false,"context_lines":[{"line_number":1280,"context_line":"    node \u003d task.node"},{"line_number":1281,"context_line":"    driver_internal_info \u003d node.driver_internal_info"},{"line_number":1282,"context_line":"    driver_internal_info.pop(\u0027boot_from_volume\u0027, None)"},{"line_number":1283,"context_line":"    driver_internal_info.pop(\u0027boot_from_volume_deploy\u0027, None)"},{"line_number":1284,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":1285,"context_line":"    node.save()"}],"source_content_type":"text/x-python","patch_set":15,"id":"da36d5c6_4f81264a","line":1283,"range":{"start_line":1283,"start_character":30,"end_line":1283,"end_character":53},"updated":"2017-02-20 09:39:09.000000000","message":"this will never be populated into driver_internal_info as cinder.should_write_image() would return \u0027False\u0027.","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ec735b5cc58d3f4bebfc3ab5fb039cca6ba24f3f","unresolved":false,"context_lines":[{"line_number":1280,"context_line":"    node \u003d task.node"},{"line_number":1281,"context_line":"    driver_internal_info \u003d node.driver_internal_info"},{"line_number":1282,"context_line":"    driver_internal_info.pop(\u0027boot_from_volume\u0027, None)"},{"line_number":1283,"context_line":"    driver_internal_info.pop(\u0027boot_from_volume_deploy\u0027, None)"},{"line_number":1284,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":1285,"context_line":"    node.save()"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a1ff146_f73d03bc","line":1283,"range":{"start_line":1283,"start_character":30,"end_line":1283,"end_character":53},"in_reply_to":"da36d5c6_4f81264a","updated":"2017-03-16 15:17:16.000000000","message":"For now :)","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"a356f0b1281a039c6ba30d7a7101f14694364f2b","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1251,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1252,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1253,"context_line":"    if vol_type !\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"},{"line_number":1254,"context_line":"        # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1255,"context_line":"        # some additional logic will be needed here to ensure we align."},{"line_number":1256,"context_line":"        # The deployment, in theory, should never reach this point"}],"source_content_type":"text/x-python","patch_set":18,"id":"ffe62b97_42ed19b5","line":1253,"range":{"start_line":1253,"start_character":16,"end_line":1253,"end_character":18},"updated":"2017-03-29 14:03:16.000000000","message":"Judging from the error message, should it be \u0027\u003d\u003d\u0027?","commit_id":"94fae07e49b096856490957d7d87177561c757ec"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69ff415fd0c73185c9bbbe9633da18b8f2d6c776","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1251,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1252,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1253,"context_line":"    if vol_type !\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"},{"line_number":1254,"context_line":"        # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1255,"context_line":"        # some additional logic will be needed here to ensure we align."},{"line_number":1256,"context_line":"        # The deployment, in theory, should never reach this point"}],"source_content_type":"text/x-python","patch_set":18,"id":"ffe62b97_fc74c2ff","line":1253,"range":{"start_line":1253,"start_character":16,"end_line":1253,"end_character":18},"in_reply_to":"ffe62b97_42ed19b5","updated":"2017-03-29 19:52:01.000000000","message":"Great catch!","commit_id":"94fae07e49b096856490957d7d87177561c757ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"86fd0fa9d3cb27c578c189adba3bbc25752d184d","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"    \"\"\""},{"line_number":1247,"context_line":"    targets \u003d task.volume_targets"},{"line_number":1248,"context_line":"    for volume in targets:"},{"line_number":1249,"context_line":"        if volume[\u0027boot_index\u0027] \u003d\u003d 0:"},{"line_number":1250,"context_line":"            return volume"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_14163e4a","line":1249,"updated":"2017-05-24 12:21:25.000000000","message":"is access by [] correct? I thought task.* has objects, not dicts..","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6fb5bc2ab8bf78a5957b9c62ffca6ca8d3ac38e8","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"    \"\"\""},{"line_number":1247,"context_line":"    targets \u003d task.volume_targets"},{"line_number":1248,"context_line":"    for volume in targets:"},{"line_number":1249,"context_line":"        if volume[\u0027boot_index\u0027] \u003d\u003d 0:"},{"line_number":1250,"context_line":"            return volume"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_7d2653bd","line":1249,"in_reply_to":"ff0f0b1f_14163e4a","updated":"2017-05-25 15:30:09.000000000","message":"Good catch. I think you\u0027re right about this. See [0] for example task.volume_targets usage.\n\n[0] https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/storage/cinder.py#L258","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"ec5ef29757e976377aa455ab3e3ac7c3820c4e82","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"    \"\"\""},{"line_number":1247,"context_line":"    targets \u003d task.volume_targets"},{"line_number":1248,"context_line":"    for volume in targets:"},{"line_number":1249,"context_line":"        if volume[\u0027boot_index\u0027] \u003d\u003d 0:"},{"line_number":1250,"context_line":"            return volume"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"df140735_b4e85d7c","line":1249,"updated":"2017-06-07 16:30:57.000000000","message":"@dtantsur - WRT your comment from PS25.\n\nDid some investigation here. targets is a list of VolumeTarget objects, but VolumeTarget uses the oslo VersionedObjectDictCompat mixin class. This means you can access class fields the same way you would access a dict\u0027s value. So leaving for now.","commit_id":"8ea868920466a5c6e0da867a11d9bf9d0f46c829"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"602258a4febc7d5d1c9c0d5764fe4785cbf1e045","unresolved":false,"context_lines":[{"line_number":1278,"context_line":""},{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"def tear_down_storage_configuration(task):"},{"line_number":1281,"context_line":"    \"\"\"Remove entries from driver_internal_info for storage.\"\"\""},{"line_number":1282,"context_line":"    for volume in task.volume_targets:"},{"line_number":1283,"context_line":"        volume.destroy()"},{"line_number":1284,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"bf091321_ca933a4f","line":1281,"range":{"start_line":1281,"start_character":7,"end_line":1281,"end_character":60},"updated":"2017-06-08 11:50:59.000000000","message":"nit: Our docstring needs to be  updated since we also nuke the target records.  Perhaps:\n\n \"\"\"Clean up storage configuration.\n\n Deletes the storage configuration from targets and driver_internal_info,\n in order to ensure a clean slate for the next boot of the machine.\"\"\"\n\n?","commit_id":"21d77525a779835d53285170948bccde91dcbb03"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"602258a4febc7d5d1c9c0d5764fe4785cbf1e045","unresolved":false,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"def tear_down_storage_configuration(task):"},{"line_number":1281,"context_line":"    \"\"\"Remove entries from driver_internal_info for storage.\"\"\""},{"line_number":1282,"context_line":"    for volume in task.volume_targets:"},{"line_number":1283,"context_line":"        volume.destroy()"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    node \u003d task.node"},{"line_number":1286,"context_line":"    driver_internal_info \u003d node.driver_internal_info"}],"source_content_type":"text/x-python","patch_set":31,"id":"bf091321_0ad7f2ef","line":1283,"range":{"start_line":1282,"start_character":4,"end_line":1283,"end_character":24},"updated":"2017-06-08 11:50:59.000000000","message":"Possibly a TODO to consider logic to allow this to be skipped. I\u0027ve spoke to two shops that would be interested in non nova driven integration out of the gate, and they would find the volume targets not getting deleted useful.  \n\nThen gain on the counter argument, we could just keep it, and they could just re-assert the volumes for the next deploy. :)","commit_id":"21d77525a779835d53285170948bccde91dcbb03"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"    \"\"\"Set node driver_internal_info for boot from volume parameters."},{"line_number":1234,"context_line":""},{"line_number":1235,"context_line":"    :param task: a TaskManager object containing the node."},{"line_number":1236,"context_line":"    :raises StorageError if node has an iSCSI boot volume defined but is not"},{"line_number":1237,"context_line":"        capable to support it."},{"line_number":1238,"context_line":"    \"\"\""},{"line_number":1239,"context_line":"    node \u003d task.node"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_995c624c","line":1236,"updated":"2017-06-12 20:45:17.000000000","message":"Also for FiberChannel","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"    \"\"\"Set node driver_internal_info for boot from volume parameters."},{"line_number":1234,"context_line":""},{"line_number":1235,"context_line":"    :param task: a TaskManager object containing the node."},{"line_number":1236,"context_line":"    :raises StorageError if node has an iSCSI boot volume defined but is not"},{"line_number":1237,"context_line":"        capable to support it."},{"line_number":1238,"context_line":"    \"\"\""},{"line_number":1239,"context_line":"    node \u003d task.node"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_319ade62","line":1236,"in_reply_to":"7f231b9d_995c624c","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"    boot_volume \u003d get_remote_boot_volume(task)"},{"line_number":1241,"context_line":"    if not boot_volume:"},{"line_number":1242,"context_line":"        return"},{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_d4261fb8","line":1243,"updated":"2017-06-12 20:45:17.000000000","message":"Just curious why not convert this to a string and make it lowercase here. I see line 1261 and 1262 do that. Or at least convert it to a string here? WDYT?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"    boot_volume \u003d get_remote_boot_volume(task)"},{"line_number":1241,"context_line":"    if not boot_volume:"},{"line_number":1242,"context_line":"        return"},{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_31e89eb2","line":1243,"in_reply_to":"7f231b9d_c6fd3c3b","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4c35900ef9a7bbdbdd07c21d28c650f97ec36411","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"    boot_volume \u003d get_remote_boot_volume(task)"},{"line_number":1241,"context_line":"    if not boot_volume:"},{"line_number":1242,"context_line":"        return"},{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_c6fd3c3b","line":1243,"in_reply_to":"7f231b9d_d4261fb8","updated":"2017-06-13 12:45:07.000000000","message":"That makes complete sense! We should do it.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"47134f327a895453388513508d1bd145b7b991ff","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"    if not boot_volume:"},{"line_number":1242,"context_line":"        return"},{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"},{"line_number":1247,"context_line":"        # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1248,"context_line":"        # some additional logic will be needed here to ensure we align."}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_ba997020","line":1245,"range":{"start_line":1244,"start_character":4,"end_line":1245,"end_character":44},"updated":"2017-06-12 04:59:43.000000000","message":"Should we rely on node.instance_info instead of node.properties as same node can be configured to boot up through local disk and a volume. The node\u0027s instance_info would tell us how the node to be provisioned.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"70c3d16fa6584d94c50e1526daddac317d0a24c2","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"    if not boot_volume:"},{"line_number":1242,"context_line":"        return"},{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"},{"line_number":1247,"context_line":"        # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1248,"context_line":"        # some additional logic will be needed here to ensure we align."}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_f7625316","line":1245,"range":{"start_line":1244,"start_character":4,"end_line":1245,"end_character":44},"in_reply_to":"7f231b9d_ba997020","updated":"2017-06-12 12:05:50.000000000","message":"The data is collected for capability about the node. Using instance info would just further complicate the data storage requirements and interaction, when we receive a very definitive direction on the configuration based upon what is submitted for volume data, and lack an image_source.\n\nAdditionally, the specification for BFV sets forth this behavior, that the capabilities are what is to be read so the operator has influence over the node\u0027s capabilities and that we don\u0027t offer a node that is incompatible for scheduling","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca5a13a56a1edab600b29a034980da6b77919800","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"},{"line_number":1247,"context_line":"        # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1248,"context_line":"        # some additional logic will be needed here to ensure we align."},{"line_number":1249,"context_line":"        # The deployment, in theory, should never reach this point"}],"source_content_type":"text/x-python","patch_set":35,"id":"9f0e0f27_c647ccbc","line":1246,"updated":"2017-06-09 10:10:34.000000000","message":"I wonder if we actually want to hardcode possible volume types here in generic code. Why can\u0027t this whole function live in a storage interface?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"f134ca78abdde9497577d0940b6a110835fe918a","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"},{"line_number":1247,"context_line":"        # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1248,"context_line":"        # some additional logic will be needed here to ensure we align."},{"line_number":1249,"context_line":"        # The deployment, in theory, should never reach this point"}],"source_content_type":"text/x-python","patch_set":35,"id":"9f0e0f27_79889a70","line":1246,"in_reply_to":"9f0e0f27_8c27b3b7","updated":"2017-06-09 13:51:20.000000000","message":"I agree with Julia. Also, iscsi/fc specific code wouldn\u0027t belong in the cinder driver for example, as cinder is not the only potential consumer of iscsi/fc. Might need some refactoring as other storage types are added but I think this is the right approach for now.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"88d128ce6225d1a5ceb02825d2e9e434cb6bb2a2","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"    vol_type \u003d boot_volume.volume_type"},{"line_number":1244,"context_line":"    node_caps \u003d driver_utils.capabilities_to_dict("},{"line_number":1245,"context_line":"        node.properties.get(\u0027capabilities\u0027))"},{"line_number":1246,"context_line":"    if vol_type \u003d\u003d \u0027iscsi\u0027 and \u0027iscsi_boot\u0027 not in node_caps:"},{"line_number":1247,"context_line":"        # TODO(TheJulia): In order to support the FCoE and HBA boot cases,"},{"line_number":1248,"context_line":"        # some additional logic will be needed here to ensure we align."},{"line_number":1249,"context_line":"        # The deployment, in theory, should never reach this point"}],"source_content_type":"text/x-python","patch_set":35,"id":"9f0e0f27_8c27b3b7","line":1246,"in_reply_to":"9f0e0f27_c647ccbc","updated":"2017-06-09 11:07:45.000000000","message":"I kind of viewed this as being fairly generic with overall standards around data types.  This method would naturally grow as new types are added that need some sort of data check/passed along for storage interface drivers to do $things.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"}],"ironic/drivers/modules/iscsi_deploy.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"c4b87cb097f9099053cf421c5cc8a64a0cead63d","unresolved":false,"context_lines":[{"line_number":468,"context_line":"             wrong occurred during the power action."},{"line_number":469,"context_line":"        \"\"\""},{"line_number":470,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":471,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":472,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":473,"context_line":"        return states.DELETED"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_8b4cc971","line":471,"range":{"start_line":471,"start_character":8,"end_line":471,"end_character":48},"updated":"2017-01-03 10:59:20.000000000","message":"Shouldn\u0027t we clear the data populated into driver_internal_info here?","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3edec89fda140b785470df9a67244ab89e0e2793","unresolved":false,"context_lines":[{"line_number":468,"context_line":"             wrong occurred during the power action."},{"line_number":469,"context_line":"        \"\"\""},{"line_number":470,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":471,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":472,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":473,"context_line":"        return states.DELETED"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_98692bfc","line":471,"range":{"start_line":471,"start_character":8,"end_line":471,"end_character":48},"in_reply_to":"ba5201f7_8b4cc971","updated":"2017-01-11 21:22:04.000000000","message":"Same reply to agent driver question.","commit_id":"d2ae22c448bc4d23b1605fbb55237465fd60da00"},{"author":{"_account_id":14614,"name":"Kyrylo Romanenko","display_name":"K.Romanenko","email":"romanenko-kv@hotmail.com","username":"kromanenko"},"change_message_id":"e34921cf9fd9821624aa06d51c2364db662e1920","unresolved":false,"context_lines":[{"line_number":487,"context_line":"            or if new cleaning ports cannot be created."},{"line_number":488,"context_line":"        :raises: InvalidParameterValue when the wrong power state is specified"},{"line_number":489,"context_line":"             or the wrong driver info is specified for power management."},{"line_number":490,"context_line":"        :raises: StorageError If the storage driver is unable to attach the"},{"line_number":491,"context_line":"            the configured volumes."},{"line_number":492,"context_line":"        :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":493,"context_line":"             wrong occurred during the power action."},{"line_number":494,"context_line":"        :raises: any boot interface\u0027s prepare_ramdisk exceptions."}],"source_content_type":"text/x-python","patch_set":15,"id":"fa31d9ce_a05e1174","line":491,"range":{"start_line":490,"start_character":72,"end_line":491,"end_character":15},"updated":"2017-02-17 14:22:39.000000000","message":"i see doubled `the` here :)","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"86fd0fa9d3cb27c578c189adba3bbc25752d184d","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        \"\"\""},{"line_number":469,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":470,"context_line":"        task.driver.storage.detach_volumes(task)"},{"line_number":471,"context_line":"        deploy_utils.tear_down_storage_configuration(task)"},{"line_number":472,"context_line":"        task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":473,"context_line":"        return states.DELETED"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_940a4e1d","line":471,"updated":"2017-05-24 12:21:25.000000000","message":"ditto (we\u0027re already repeating ourselves)","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"86fd0fa9d3cb27c578c189adba3bbc25752d184d","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                # already configured, unbind tenant ports if present"},{"line_number":506,"context_line":"                task.driver.network.unconfigure_tenant_networks(task)"},{"line_number":507,"context_line":"                task.driver.network.add_provisioning_network(task)"},{"line_number":508,"context_line":"                task.driver.storage.attach_volumes(task)"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"            deploy_opts \u003d deploy_utils.build_agent_options(node)"},{"line_number":511,"context_line":"            task.driver.boot.prepare_ramdisk(task, deploy_opts)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_74157a3f","line":508,"updated":"2017-05-24 12:21:25.000000000","message":"ditto","commit_id":"b9d27ffcf5d69a51872d32c950d84fc3ce40f919"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"37a3fa0a47e4a84f292539fd1b14f47c405e0bb3","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        :raises: InvalidParameterValue when the wrong state is specified"},{"line_number":465,"context_line":"             or the wrong driver info is specified."},{"line_number":466,"context_line":"        :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":467,"context_line":"             wrong occurred during the power action."},{"line_number":468,"context_line":"        \"\"\""},{"line_number":469,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":470,"context_line":"        task.driver.storage.detach_volumes(task)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_fea45c0a","line":467,"updated":"2017-06-12 19:42:29.000000000","message":"missed StorageError","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        :raises: InvalidParameterValue when the wrong state is specified"},{"line_number":465,"context_line":"             or the wrong driver info is specified."},{"line_number":466,"context_line":"        :raises: other exceptions by the node\u0027s power driver if something"},{"line_number":467,"context_line":"             wrong occurred during the power action."},{"line_number":468,"context_line":"        \"\"\""},{"line_number":469,"context_line":"        manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":470,"context_line":"        task.driver.storage.detach_volumes(task)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_919ad26b","line":467,"in_reply_to":"7f231b9d_fea45c0a","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"}],"ironic/tests/unit/conductor/test_utils.py":[{"author":{"_account_id":14614,"name":"Kyrylo Romanenko","display_name":"K.Romanenko","email":"romanenko-kv@hotmail.com","username":"kromanenko"},"change_message_id":"e34921cf9fd9821624aa06d51c2364db662e1920","unresolved":false,"context_lines":[{"line_number":519,"context_line":"                self.assertIsNone(node[\u0027last_error\u0027])"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def test_node_power_action_power_off_storage_detach(self):"},{"line_number":522,"context_line":"        \"\"\"Test node_power_action to turn node power on and detach storage.\"\"\""},{"line_number":523,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":524,"context_line":"                                          uuid\u003duuidutils.generate_uuid(),"},{"line_number":525,"context_line":"                                          driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa31d9ce_6016d9a8","line":522,"range":{"start_line":522,"start_character":46,"end_line":522,"end_character":55},"updated":"2017-02-17 14:22:39.000000000","message":"It looks that here should be \"power off\".","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf2fb716db27b9062d685947b78f9c2ba64ac677","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":533,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":534,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":535,"context_line":"                                   \u0027detach_volumes\u0027) as attach_mock:"},{"line_number":536,"context_line":"                conductor_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_2dd6eef2","line":535,"range":{"start_line":535,"start_character":56,"end_line":535,"end_character":67},"updated":"2017-06-02 09:03:41.000000000","message":"nit: I prefer detach_mock.","commit_id":"637c23e43c18e84ef95c849fc5dae27d65cfae1a"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"5d1f6de29ef5cd67473a0425522652452eda7eec","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":533,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":534,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":535,"context_line":"                                   \u0027detach_volumes\u0027) as attach_mock:"},{"line_number":536,"context_line":"                conductor_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_fc3ca531","line":535,"range":{"start_line":535,"start_character":56,"end_line":535,"end_character":67},"in_reply_to":"df140735_2dd6eef2","updated":"2017-06-08 13:35:21.000000000","message":"Done","commit_id":"637c23e43c18e84ef95c849fc5dae27d65cfae1a"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":508,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":509,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"},{"line_number":510,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":511,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_79fd0639","line":508,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to this?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":508,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":509,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"},{"line_number":510,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":511,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_1113620f","line":508,"in_reply_to":"7f231b9d_79fd0639","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                                          provision_state\u003dstates.ACTIVE)"},{"line_number":529,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":532,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":533,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":534,"context_line":"            with mock.patch.object(task.driver.storage,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_59fa4a42","line":531,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to this?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                                          provision_state\u003dstates.ACTIVE)"},{"line_number":529,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":532,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":533,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":534,"context_line":"            with mock.patch.object(task.driver.storage,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_31109e01","line":531,"in_reply_to":"7f231b9d_59fa4a42","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":552,"context_line":"                                          provision_state\u003dstates.ACTIVE)"},{"line_number":553,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":556,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":557,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":558,"context_line":"            with mock.patch.object(task.driver.storage,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_199a9213","line":555,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to this?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":552,"context_line":"                                          provision_state\u003dstates.ACTIVE)"},{"line_number":553,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":556,"context_line":"                               \u0027get_power_state\u0027) as get_power_mock:"},{"line_number":557,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":558,"context_line":"            with mock.patch.object(task.driver.storage,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_710616d1","line":555,"in_reply_to":"7f231b9d_199a9213","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                    second_notif_args, \u0027ironic-conductor\u0027, CONF.host,"},{"line_number":494,"context_line":"                    \u0027baremetal.node.power_set.error\u0027,"},{"line_number":495,"context_line":"                    obj_fields.NotificationLevel.ERROR)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_node_power_action_power_on_storage_attach(self):"},{"line_number":498,"context_line":"        \"\"\"Test node_power_action to turn node power on and attach storage.\"\"\""},{"line_number":499,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_9f9e5852","line":496,"updated":"2017-06-13 23:03:44.000000000","message":"I wonder if these three tests could be done with a helper function and one test which calls the helper? WDYT? I\u0027m okay with it as it is.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e76f7ed764c4e038404e2604d2288d2256c9d0c3","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                    second_notif_args, \u0027ironic-conductor\u0027, CONF.host,"},{"line_number":494,"context_line":"                    \u0027baremetal.node.power_set.error\u0027,"},{"line_number":495,"context_line":"                    obj_fields.NotificationLevel.ERROR)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_node_power_action_power_on_storage_attach(self):"},{"line_number":498,"context_line":"        \"\"\"Test node_power_action to turn node power on and attach storage.\"\"\""},{"line_number":499,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_5043d86c","line":496,"in_reply_to":"7f231b9d_9f9e5852","updated":"2017-06-15 12:29:33.000000000","message":"Possibly as an optimization, but I suspect that would just become an obfuscation of the tests as starting and ultimate testing states differ across the tests since they are testing the two different paths that node power state is called.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":504,"context_line":"                                          provision_state\u003dstates.ACTIVE)"},{"line_number":505,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":508,"context_line":"                               \u0027get_power_state\u0027,"},{"line_number":509,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":510,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_9f93f8a3","line":507,"updated":"2017-06-13 23:03:44.000000000","message":"Is it needed to mock this? Is it because we want to check that it is called once (L516) ? Though if it calls \u0027attach_volumes\u0027 then I\u0027m not sure how it can\u0027t call \u0027get_power_state\u0027.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e76f7ed764c4e038404e2604d2288d2256c9d0c3","unresolved":false,"context_lines":[{"line_number":504,"context_line":"                                          provision_state\u003dstates.ACTIVE)"},{"line_number":505,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":508,"context_line":"                               \u0027get_power_state\u0027,"},{"line_number":509,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":510,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_f310ae50","line":507,"in_reply_to":"7f231b9d_9f93f8a3","updated":"2017-06-15 12:29:33.000000000","message":"Stylistic differences I guess. With the fake driver, it looks like it returns just the current state, which we do set above in the test. I guess we can remove it.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":504,"context_line":"                                          provision_state\u003dstates.ACTIVE)"},{"line_number":505,"context_line":"        task \u003d task_manager.TaskManager(self.context, node.uuid)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":508,"context_line":"                               \u0027get_power_state\u0027,"},{"line_number":509,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":510,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_9e2f413e","line":507,"in_reply_to":"7f231b9d_f310ae50","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                               \u0027get_power_state\u0027,"},{"line_number":509,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":510,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"},{"line_number":511,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":512,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"},{"line_number":513,"context_line":"                conductor_utils.node_power_action(task, states.POWER_ON)"},{"line_number":514,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_df03b072","line":511,"updated":"2017-06-13 23:03:44.000000000","message":"I\u0027m thinking it would be good to mock \u0027detach_volumes\u0027 and make sure it isn\u0027t called. But maybe that is overkill?","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                               \u0027get_power_state\u0027,"},{"line_number":509,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":510,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"},{"line_number":511,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":512,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"},{"line_number":513,"context_line":"                conductor_utils.node_power_action(task, states.POWER_ON)"},{"line_number":514,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_9ed4e121","line":511,"in_reply_to":"7f231b9d_df03b072","updated":"2017-06-15 13:39:06.000000000","message":"Yeah, I think that is overkill.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":509,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":510,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"},{"line_number":511,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":512,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"},{"line_number":513,"context_line":"                conductor_utils.node_power_action(task, states.POWER_ON)"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_6ca75851","line":512,"updated":"2017-06-13 23:03:44.000000000","message":"Missed this last time. Can \u0027autospec\u003dTrue\u0027 be added?\n\nAny reason to not use a decorator for these? Seems like we usually use decorators for mocks.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":509,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":510,"context_line":"            get_power_mock.return_value \u003d states.POWER_OFF"},{"line_number":511,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":512,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"},{"line_number":513,"context_line":"                conductor_utils.node_power_action(task, states.POWER_ON)"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_9ebd01da","line":512,"in_reply_to":"7f231b9d_6ca75851","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":513,"context_line":"                conductor_utils.node_power_action(task, states.POWER_ON)"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"                node.refresh()"},{"line_number":516,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":517,"context_line":"                attach_mock.assert_called_once_with(mock.ANY)"},{"line_number":518,"context_line":"                self.assertEqual(states.POWER_ON, node[\u0027power_state\u0027])"},{"line_number":519,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_bfe7d412","line":516,"range":{"start_line":516,"start_character":55,"end_line":516,"end_character":63},"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":513,"context_line":"                conductor_utils.node_power_action(task, states.POWER_ON)"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"                node.refresh()"},{"line_number":516,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":517,"context_line":"                attach_mock.assert_called_once_with(mock.ANY)"},{"line_number":518,"context_line":"                self.assertEqual(states.POWER_ON, node[\u0027power_state\u0027])"},{"line_number":519,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_79d91f55","line":516,"range":{"start_line":516,"start_character":55,"end_line":516,"end_character":63},"in_reply_to":"7f231b9d_bfe7d412","updated":"2017-06-15 13:39:06.000000000","message":"Removed","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":514,"context_line":""},{"line_number":515,"context_line":"                node.refresh()"},{"line_number":516,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":517,"context_line":"                attach_mock.assert_called_once_with(mock.ANY)"},{"line_number":518,"context_line":"                self.assertEqual(states.POWER_ON, node[\u0027power_state\u0027])"},{"line_number":519,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"},{"line_number":520,"context_line":"                self.assertIsNone(node[\u0027last_error\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_7fca5c6d","line":517,"range":{"start_line":517,"start_character":52,"end_line":517,"end_character":60},"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":514,"context_line":""},{"line_number":515,"context_line":"                node.refresh()"},{"line_number":516,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":517,"context_line":"                attach_mock.assert_called_once_with(mock.ANY)"},{"line_number":518,"context_line":"                self.assertEqual(states.POWER_ON, node[\u0027power_state\u0027])"},{"line_number":519,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"},{"line_number":520,"context_line":"                self.assertIsNone(node[\u0027last_error\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_b91577e7","line":517,"range":{"start_line":517,"start_character":52,"end_line":517,"end_character":60},"in_reply_to":"7f231b9d_7fca5c6d","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":534,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":535,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":536,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":537,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"},{"line_number":538,"context_line":"                conductor_utils.node_power_action(task, states.REBOOT)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_2c672028","line":537,"updated":"2017-06-13 23:03:44.000000000","message":"Missed this last time. Can \u0027autospec\u003dTrue\u0027 be added?\n\nAny reason to not use a decorator for these? Seems like we usually use decorators for mocks.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e76f7ed764c4e038404e2604d2288d2256c9d0c3","unresolved":false,"context_lines":[{"line_number":534,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":535,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":536,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":537,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"},{"line_number":538,"context_line":"                conductor_utils.node_power_action(task, states.REBOOT)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_d36012d2","line":537,"in_reply_to":"7f231b9d_2c672028","updated":"2017-06-15 12:29:33.000000000","message":"I think it has to do with task invocation, but truthfully I\u0027m not sure at this point. These tests were written a long time ago at this point.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":534,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":535,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":536,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":537,"context_line":"                                   \u0027attach_volumes\u0027) as attach_mock:"},{"line_number":538,"context_line":"                conductor_utils.node_power_action(task, states.REBOOT)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_5eb3e90a","line":537,"in_reply_to":"7f231b9d_d36012d2","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":538,"context_line":"                conductor_utils.node_power_action(task, states.REBOOT)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"                node.refresh()"},{"line_number":541,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":542,"context_line":"                attach_mock.assert_called_once_with(mock.ANY)"},{"line_number":543,"context_line":"                self.assertEqual(states.POWER_ON, node[\u0027power_state\u0027])"},{"line_number":544,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_1fa5a8b5","line":541,"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":538,"context_line":"                conductor_utils.node_power_action(task, states.REBOOT)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"                node.refresh()"},{"line_number":541,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":542,"context_line":"                attach_mock.assert_called_once_with(mock.ANY)"},{"line_number":543,"context_line":"                self.assertEqual(states.POWER_ON, node[\u0027power_state\u0027])"},{"line_number":544,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_39df273b","line":541,"in_reply_to":"7f231b9d_1fa5a8b5","updated":"2017-06-15 13:39:06.000000000","message":"Removed","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":539,"context_line":""},{"line_number":540,"context_line":"                node.refresh()"},{"line_number":541,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":542,"context_line":"                attach_mock.assert_called_once_with(mock.ANY)"},{"line_number":543,"context_line":"                self.assertEqual(states.POWER_ON, node[\u0027power_state\u0027])"},{"line_number":544,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"},{"line_number":545,"context_line":"                self.assertIsNone(node[\u0027last_error\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_ffab0c86","line":542,"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":560,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":561,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":562,"context_line":"                                   \u0027detach_volumes\u0027) as detach_mock:"},{"line_number":563,"context_line":"                conductor_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_6c55181d","line":562,"updated":"2017-06-13 23:03:44.000000000","message":"Missed this last time. Can \u0027autospec\u003dTrue\u0027 be added?\n\nAny reason to not use a decorator for these? Seems like we usually use decorators for mocks.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":560,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":561,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":562,"context_line":"                                   \u0027detach_volumes\u0027) as detach_mock:"},{"line_number":563,"context_line":"                conductor_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_1ed1f123","line":562,"in_reply_to":"7f231b9d_6c55181d","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":563,"context_line":"                conductor_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"                node.refresh()"},{"line_number":566,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":567,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":568,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":569,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_bf959442","line":566,"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":563,"context_line":"                conductor_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"                node.refresh()"},{"line_number":566,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":567,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":568,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":569,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_d9c6f368","line":566,"in_reply_to":"7f231b9d_bf959442","updated":"2017-06-15 13:39:06.000000000","message":"Removed","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":564,"context_line":""},{"line_number":565,"context_line":"                node.refresh()"},{"line_number":566,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":567,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":568,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":569,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"},{"line_number":570,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_5f9a006e","line":567,"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":564,"context_line":""},{"line_number":565,"context_line":"                node.refresh()"},{"line_number":566,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":567,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":568,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":569,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"},{"line_number":570,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_f992cf56","line":567,"in_reply_to":"7f231b9d_5f9a006e","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":675,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":676,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":677,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":678,"context_line":"                                   \u0027detach_volumes\u0027) as detach_mock:"},{"line_number":679,"context_line":"                conductor_utils.node_power_action(task, states.SOFT_POWER_OFF)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_cc254cc4","line":678,"updated":"2017-06-13 23:03:44.000000000","message":"Missed this last time. Can \u0027autospec\u003dTrue\u0027 be added?\n\nAny reason to not use a decorator for these? Seems like we usually use decorators for mocks.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":675,"context_line":"                               autospec\u003dTrue) as get_power_mock:"},{"line_number":676,"context_line":"            get_power_mock.return_value \u003d states.POWER_ON"},{"line_number":677,"context_line":"            with mock.patch.object(task.driver.storage,"},{"line_number":678,"context_line":"                                   \u0027detach_volumes\u0027) as detach_mock:"},{"line_number":679,"context_line":"                conductor_utils.node_power_action(task, states.SOFT_POWER_OFF)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"                node.refresh()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_f9c9af58","line":678,"in_reply_to":"7f231b9d_cc254cc4","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                conductor_utils.node_power_action(task, states.SOFT_POWER_OFF)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"                node.refresh()"},{"line_number":682,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":683,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":684,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":685,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_ff842c0e","line":682,"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                conductor_utils.node_power_action(task, states.SOFT_POWER_OFF)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"                node.refresh()"},{"line_number":682,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":683,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":684,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":685,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_59af837c","line":682,"in_reply_to":"7f231b9d_ff842c0e","updated":"2017-06-15 13:39:06.000000000","message":"Removed","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":680,"context_line":""},{"line_number":681,"context_line":"                node.refresh()"},{"line_number":682,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":683,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":684,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":685,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"},{"line_number":686,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_df87300f","line":683,"updated":"2017-06-13 23:03:44.000000000","message":"s/mock.ANY/task","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":680,"context_line":""},{"line_number":681,"context_line":"                node.refresh()"},{"line_number":682,"context_line":"                get_power_mock.assert_called_once_with(mock.ANY)"},{"line_number":683,"context_line":"                detach_mock.assert_called_once_with(mock.ANY,"},{"line_number":684,"context_line":"                                                    allow_errors\u003dTrue)"},{"line_number":685,"context_line":"                self.assertEqual(states.POWER_OFF, node[\u0027power_state\u0027])"},{"line_number":686,"context_line":"                self.assertIsNone(node[\u0027target_power_state\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_39b4c7d0","line":683,"in_reply_to":"7f231b9d_df87300f","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"}],"ironic/tests/unit/drivers/modules/test_agent.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            self.assertEqual(driver_return, states.DEPLOYWAIT)"},{"line_number":265,"context_line":"            power_mock.assert_called_once_with(task, states.REBOOT)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027detach_volumes\u0027)"},{"line_number":268,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":269,"context_line":"                \u0027unconfigure_tenant_networks\u0027, autospec\u003dTrue)"},{"line_number":270,"context_line":"    @mock.patch(\u0027ironic.conductor.utils.node_power_action\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_548e8f78","line":267,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to these mocks?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            self.assertEqual(driver_return, states.DEPLOYWAIT)"},{"line_number":265,"context_line":"            power_mock.assert_called_once_with(task, states.REBOOT)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027detach_volumes\u0027)"},{"line_number":268,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":269,"context_line":"                \u0027unconfigure_tenant_networks\u0027, autospec\u003dTrue)"},{"line_number":270,"context_line":"    @mock.patch(\u0027ironic.conductor.utils.node_power_action\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_31589e30","line":267,"in_reply_to":"7f231b9d_548e8f78","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                self.context, self.node[\u0027uuid\u0027], shared\u003dFalse) as task:"},{"line_number":286,"context_line":"            self.assertEqual(0, len(task.volume_targets))"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":289,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":290,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_ramdisk\u0027)"},{"line_number":291,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_14eed721","line":288,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to these mocks?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                self.context, self.node[\u0027uuid\u0027], shared\u003dFalse) as task:"},{"line_number":286,"context_line":"            self.assertEqual(0, len(task.volume_targets))"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":289,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":290,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_ramdisk\u0027)"},{"line_number":291,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_f141063b","line":288,"in_reply_to":"7f231b9d_14eed721","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        self.node.refresh()"},{"line_number":341,"context_line":"        self.assertEqual(\u0027bar\u0027, self.node.instance_info[\u0027foo\u0027])"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":344,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":345,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":346,"context_line":"                \u0027add_provisioning_network\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_74e62b47","line":343,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to these mocks?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        self.node.refresh()"},{"line_number":341,"context_line":"        self.assertEqual(\u0027bar\u0027, self.node.instance_info[\u0027foo\u0027])"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":344,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":345,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":346,"context_line":"                \u0027add_provisioning_network\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_11824250","line":343,"in_reply_to":"7f231b9d_74e62b47","updated":"2017-06-13 21:17:59.000000000","message":"I guess, although I don\u0027t quite see the use with the test.  Going ahead and adding it.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                task.driver.storage, task)"},{"line_number":286,"context_line":"        with task_manager.acquire("},{"line_number":287,"context_line":"                self.context, self.node[\u0027uuid\u0027], shared\u003dFalse) as task:"},{"line_number":288,"context_line":"            self.assertEqual(0, len(task.volume_targets))"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027,"},{"line_number":291,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_1f66c852","line":288,"updated":"2017-06-13 23:03:44.000000000","message":"I\u0027m confused on what this is verifying/testing.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e76f7ed764c4e038404e2604d2288d2256c9d0c3","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                task.driver.storage, task)"},{"line_number":286,"context_line":"        with task_manager.acquire("},{"line_number":287,"context_line":"                self.context, self.node[\u0027uuid\u0027], shared\u003dFalse) as task:"},{"line_number":288,"context_line":"            self.assertEqual(0, len(task.volume_targets))"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027,"},{"line_number":291,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_d0736815","line":288,"in_reply_to":"7f231b9d_1f66c852","updated":"2017-06-15 12:29:33.000000000","message":"post tear down, that there are no volumes.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                task.driver.storage, task)"},{"line_number":286,"context_line":"        with task_manager.acquire("},{"line_number":287,"context_line":"                self.context, self.node[\u0027uuid\u0027], shared\u003dFalse) as task:"},{"line_number":288,"context_line":"            self.assertEqual(0, len(task.volume_targets))"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027,"},{"line_number":291,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_13968a4d","line":288,"in_reply_to":"7f231b9d_d0736815","updated":"2017-06-15 13:39:06.000000000","message":"Adding comment in line.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"}],"ironic/tests/unit/drivers/modules/test_deploy_utils.py":[{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"a36b22e7c8c5b4d41e7f40803b2a12f43f3746de","unresolved":false,"context_lines":[{"line_number":2369,"context_line":"        obj_utils.create_test_volume_target("},{"line_number":2370,"context_line":"            self.context, node_id\u003dself.node.id, volume_type\u003d\u0027iscsi\u0027,"},{"line_number":2371,"context_line":"            boot_index\u003d0, volume_id\u003d\u00271234\u0027, uuid\u003dvol_uuid)"},{"line_number":2372,"context_line":"        # NOTE(TheJulia): Since the defult for the storage_interface"},{"line_number":2373,"context_line":"        # is a noop interface, we need to define another driver that"},{"line_number":2374,"context_line":"        # can be loaded by driver_manager in order to create the task"},{"line_number":2375,"context_line":"        # to test this method."}],"source_content_type":"text/x-python","patch_set":15,"id":"da36d5c6_77c17280","line":2372,"range":{"start_line":2372,"start_character":36,"end_line":2372,"end_character":42},"updated":"2017-02-19 06:09:51.000000000","message":"default","commit_id":"9b5a9a7282062d7df2a18dbc01995b8e08b9e78b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca5a13a56a1edab600b29a034980da6b77919800","unresolved":false,"context_lines":[{"line_number":2416,"context_line":"            self.assertEqual("},{"line_number":2417,"context_line":"                vol_uuid,"},{"line_number":2418,"context_line":"                task.node.driver_internal_info.get(\u0027boot_from_volume_deploy\u0027,"},{"line_number":2419,"context_line":"                                                   None))"},{"line_number":2420,"context_line":"        node2 \u003d obj_utils.create_test_node("},{"line_number":2421,"context_line":"            self.context,"},{"line_number":2422,"context_line":"            driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"9f0e0f27_e63ad032","line":2419,"updated":"2017-06-09 10:10:34.000000000","message":"nit: looks like the test can be split at this point","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":2416,"context_line":"            self.assertEqual("},{"line_number":2417,"context_line":"                vol_uuid,"},{"line_number":2418,"context_line":"                task.node.driver_internal_info.get(\u0027boot_from_volume_deploy\u0027,"},{"line_number":2419,"context_line":"                                                   None))"},{"line_number":2420,"context_line":"        node2 \u003d obj_utils.create_test_node("},{"line_number":2421,"context_line":"            self.context,"},{"line_number":2422,"context_line":"            driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_5699d01c","line":2419,"in_reply_to":"9f0e0f27_4c563b09","updated":"2017-06-13 21:17:59.000000000","message":"Split into two separate tests.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"88d128ce6225d1a5ceb02825d2e9e434cb6bb2a2","unresolved":false,"context_lines":[{"line_number":2416,"context_line":"            self.assertEqual("},{"line_number":2417,"context_line":"                vol_uuid,"},{"line_number":2418,"context_line":"                task.node.driver_internal_info.get(\u0027boot_from_volume_deploy\u0027,"},{"line_number":2419,"context_line":"                                                   None))"},{"line_number":2420,"context_line":"        node2 \u003d obj_utils.create_test_node("},{"line_number":2421,"context_line":"            self.context,"},{"line_number":2422,"context_line":"            driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"9f0e0f27_4c563b09","line":2419,"in_reply_to":"9f0e0f27_e63ad032","updated":"2017-06-09 11:07:45.000000000","message":"Good point, just looks like the second one is going for the other information type handled by the method.","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"}],"ironic/tests/unit/drivers/modules/test_iscsi_deploy.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":602,"context_line":"                task.driver.boot, task)"},{"line_number":603,"context_line":"            self.assertEqual(0, add_provisioning_net_mock.call_count)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":606,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":607,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027, autospec\u003dTrue)"},{"line_number":608,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_ramdisk\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_54b56f30","line":605,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to these mocks?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":602,"context_line":"                task.driver.boot, task)"},{"line_number":603,"context_line":"            self.assertEqual(0, add_provisioning_net_mock.call_count)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":606,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":607,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027, autospec\u003dTrue)"},{"line_number":608,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_ramdisk\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_96fe48ac","line":605,"in_reply_to":"7f231b9d_54b56f30","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"621ea91d236f8784ed5db020acc47182b5bb2935","unresolved":false,"context_lines":[{"line_number":642,"context_line":"            mock_check_image_size.assert_called_once_with(task)"},{"line_number":643,"context_line":"            mock_node_power_action.assert_called_once_with(task, states.REBOOT)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027detach_volumes\u0027)"},{"line_number":646,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":647,"context_line":"                \u0027unconfigure_tenant_networks\u0027, autospec\u003dTrue)"},{"line_number":648,"context_line":"    @mock.patch.object(manager_utils, \u0027node_power_action\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_f47d9b6e","line":645,"updated":"2017-06-12 20:45:17.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added to these mocks?","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"069499e3f8dce97c1238c8c904f9203ec5bb7b35","unresolved":false,"context_lines":[{"line_number":642,"context_line":"            mock_check_image_size.assert_called_once_with(task)"},{"line_number":643,"context_line":"            mock_node_power_action.assert_called_once_with(task, states.REBOOT)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027detach_volumes\u0027)"},{"line_number":646,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":647,"context_line":"                \u0027unconfigure_tenant_networks\u0027, autospec\u003dTrue)"},{"line_number":648,"context_line":"    @mock.patch.object(manager_utils, \u0027node_power_action\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f231b9d_3629b437","line":645,"in_reply_to":"7f231b9d_f47d9b6e","updated":"2017-06-13 21:17:59.000000000","message":"Done","commit_id":"9a370083c34767bf0b21d56366e8dd5471357974"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":568,"context_line":"            validate_capabilities_mock.assert_called_once_with(task.node)"},{"line_number":569,"context_line":"            validate_mock.assert_called_once_with(task)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":572,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":573,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":574,"context_line":"                \u0027add_provisioning_network\u0027, spec_set\u003dTrue, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_c2e75312","line":571,"updated":"2017-06-13 23:03:44.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added?","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":568,"context_line":"            validate_capabilities_mock.assert_called_once_with(task.node)"},{"line_number":569,"context_line":"            validate_mock.assert_called_once_with(task)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":572,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":573,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":574,"context_line":"                \u0027add_provisioning_network\u0027, spec_set\u003dTrue, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_d3bc9207","line":571,"in_reply_to":"7f231b9d_c2e75312","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            validate_mock.assert_called_once_with(task)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":572,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":573,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":574,"context_line":"                \u0027add_provisioning_network\u0027, spec_set\u003dTrue, autospec\u003dTrue)"},{"line_number":575,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_instance\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_02b78bf8","line":572,"updated":"2017-06-13 23:03:44.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added?","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            validate_mock.assert_called_once_with(task)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027)"},{"line_number":572,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":573,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"},{"line_number":574,"context_line":"                \u0027add_provisioning_network\u0027, spec_set\u003dTrue, autospec\u003dTrue)"},{"line_number":575,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_instance\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_b3b91616","line":572,"in_reply_to":"7f231b9d_02b78bf8","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027,"},{"line_number":606,"context_line":"                       autospec\u003dTrue)"},{"line_number":607,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":608,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027, autospec\u003dTrue)"},{"line_number":609,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_ramdisk\u0027, autospec\u003dTrue)"},{"line_number":610,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_e2b92fe9","line":607,"updated":"2017-06-13 23:03:44.000000000","message":"Can \u0027autospec\u003dTrue\u0027 be added?","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    @mock.patch.object(noop_storage.NoopStorage, \u0027attach_volumes\u0027,"},{"line_number":606,"context_line":"                       autospec\u003dTrue)"},{"line_number":607,"context_line":"    @mock.patch.object(deploy_utils, \u0027populate_storage_driver_internal_info\u0027)"},{"line_number":608,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027, autospec\u003dTrue)"},{"line_number":609,"context_line":"    @mock.patch.object(pxe.PXEBoot, \u0027prepare_ramdisk\u0027, autospec\u003dTrue)"},{"line_number":610,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.network.flat.FlatNetwork.\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_13e8cadf","line":607,"in_reply_to":"7f231b9d_e2b92fe9","updated":"2017-06-15 13:39:06.000000000","message":"Done","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"fbe8ba5c2f0db034b918bfa0e2dad56b88cade69","unresolved":false,"context_lines":[{"line_number":666,"context_line":"                task.driver.storage, task)"},{"line_number":667,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":668,"context_line":"                                  self.node.uuid, shared\u003dFalse) as task:"},{"line_number":669,"context_line":"            self.assertEqual(0, len(task.volume_targets))"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"    @mock.patch(\u0027ironic.common.dhcp_factory.DHCPFactory._set_dhcp_provider\u0027)"},{"line_number":672,"context_line":"    @mock.patch(\u0027ironic.common.dhcp_factory.DHCPFactory.clean_dhcp\u0027)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_228e072e","line":669,"updated":"2017-06-13 23:03:44.000000000","message":"What is this verifying/testing? And why does it require acquiring a new task?","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f9d9faabb03bcf1bf521c9a03ad28710f1affa27","unresolved":false,"context_lines":[{"line_number":666,"context_line":"                task.driver.storage, task)"},{"line_number":667,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":668,"context_line":"                                  self.node.uuid, shared\u003dFalse) as task:"},{"line_number":669,"context_line":"            self.assertEqual(0, len(task.volume_targets))"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"    @mock.patch(\u0027ironic.common.dhcp_factory.DHCPFactory._set_dhcp_provider\u0027)"},{"line_number":672,"context_line":"    @mock.patch(\u0027ironic.common.dhcp_factory.DHCPFactory.clean_dhcp\u0027)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f231b9d_b31596e7","line":669,"in_reply_to":"7f231b9d_228e072e","updated":"2017-06-15 13:39:06.000000000","message":"Added comment in-line.","commit_id":"925d14d30abb30d21ff094f9a76ee956e680d7bc"}]}
