)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"be3281a373a800417d24d6bb2966a6b1a30acebe","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add API and conductor methods for [un]rescue"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds API and Conductor methods to support rescue and unrescue."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I3953ff0b1ca000f8ae83fb7b3c663f848a149345"},{"line_number":12,"context_line":"Partial-bug: #1526449"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ba5da102_16eaa90f","line":9,"updated":"2016-10-28 20:06:46.000000000","message":"Let\u0027s explain this more :)","commit_id":"6366247f6c230c6b281c5449f31b02ae28001f9c"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"289200ffc00d445b7d98a9baaac63977028b98a2","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add API and conductor methods for [un]rescue"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds API and Conductor methods to support rescue and unrescue."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I3953ff0b1ca000f8ae83fb7b3c663f848a149345"},{"line_number":12,"context_line":"Partial-bug: #1526449"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ba5da102_db308aeb","line":9,"in_reply_to":"ba5da102_16eaa90f","updated":"2016-11-04 19:22:22.000000000","message":"Let me know if I can do a better job. I added some more infos.","commit_id":"6366247f6c230c6b281c5449f31b02ae28001f9c"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"d78a606d0ded3d6dda3b89d3ebe69753d212d4bf","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add API and conductor methods for [un]rescue"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds API and Conductor methods to support rescue and unrescue."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"After rescuing a node, it will be left running a rescue ramdisk,"},{"line_number":12,"context_line":"configured with the rescue_password, and listening with ssh on the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"3a461143_e2d5cb1b","line":9,"updated":"2017-01-31 23:53:17.000000000","message":"this line seems redundant","commit_id":"f0c30d33d292d97ccd4d670c5811cde12c13c6a4"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"e0bfa838874c0ca79d467827bbe11d75248779c5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add API and conductor methods for [un]rescue"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds API and Conductor methods to support rescue and unrescue."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"After rescuing a node, it will be left running a rescue ramdisk,"},{"line_number":12,"context_line":"configured with the rescue_password, and listening with ssh on the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":29,"id":"3a461143_1e25ab5b","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":62},"updated":"2017-02-01 19:27:38.000000000","message":"nit: could be removed","commit_id":"8d4c56519b25df1d1b420c7b5ea70eb6c3b3a4a6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This change raised the complexity of the provision method in the node"},{"line_number":18,"context_line":"controller. I have added a todo to the method to refactor it to be"},{"line_number":19,"context_line":"less complex, and raised the permitted complexity in tox.ini."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I3953ff0b1ca000f8ae83fb7b3c663f848a149345"},{"line_number":22,"context_line":"Partial-bug: #1526449"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":77,"id":"7f96bb07_5e7143a7","line":19,"updated":"2018-01-18 21:59:55.000000000","message":"if anyone has time, it would be good to take a look at this, but I don\u0027t want it to hold up getting this merged.","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This change raised the complexity of the provision method in the node"},{"line_number":18,"context_line":"controller. I have added a todo to the method to refactor it to be"},{"line_number":19,"context_line":"less complex, and raised the permitted complexity in tox.ini."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I3953ff0b1ca000f8ae83fb7b3c663f848a149345"},{"line_number":22,"context_line":"Partial-bug: #1526449"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":77,"id":"7f96bb07_88821852","line":19,"in_reply_to":"7f96bb07_5e7143a7","updated":"2018-01-19 14:20:11.000000000","message":"This note was put when the complexity had increased to 21 from 17. It has been now reduced to 18.","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"}],"doc/source/contributor/webapi-version-history.rst":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":2,"context_line":"REST API Version History"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"1.37 (Queens, 9.4.0)"},{"line_number":6,"context_line":"---------------------"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"Added provision_state verbs ``rescue`` and ``unrescue`` along with"}],"source_content_type":"text/x-rst","patch_set":77,"id":"7f96bb07_3e7c7770","line":5,"updated":"2018-01-18 21:59:55.000000000","message":"s/9.4.0/10.0.0/","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"REST API Version History"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"1.37 (Queens, 9.4.0)"},{"line_number":6,"context_line":"---------------------"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"Added provision_state verbs ``rescue`` and ``unrescue`` along with"}],"source_content_type":"text/x-rst","patch_set":77,"id":"7f96bb07_b26bc883","line":5,"in_reply_to":"7f96bb07_3e7c7770","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":11,"context_line":"a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":12,"context_line":"ramdisk, configured with the ``rescue_password``, and listening with"},{"line_number":13,"context_line":"ssh on the specified network interfaces. Unrescuing a node will return"},{"line_number":14,"context_line":"it to ``active``. Added ``rescue_interface`` to the node object, to"},{"line_number":15,"context_line":"allow setting the rescue interface for a dynamic driver."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"1.36 (Queens, 9.3.0)"}],"source_content_type":"text/x-rst","patch_set":77,"id":"7f96bb07_be8f2773","line":14,"updated":"2018-01-18 21:59:55.000000000","message":"maybe start a new paragraph for \u0027Added rescue_interface to the node object...","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":12,"context_line":"ramdisk, configured with the ``rescue_password``, and listening with"},{"line_number":13,"context_line":"ssh on the specified network interfaces. Unrescuing a node will return"},{"line_number":14,"context_line":"it to ``active``. Added ``rescue_interface`` to the node object, to"},{"line_number":15,"context_line":"allow setting the rescue interface for a dynamic driver."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"1.36 (Queens, 9.3.0)"}],"source_content_type":"text/x-rst","patch_set":77,"id":"7f96bb07_d2fd34b2","line":14,"in_reply_to":"7f96bb07_be8f2773","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":14,"context_line":"it to ``active``. Added ``rescue_interface`` to the node object, to"},{"line_number":15,"context_line":"allow setting the rescue interface for a dynamic driver."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"1.36 (Queens, 9.3.0)"},{"line_number":18,"context_line":"--------------------"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Added ``agent_version`` parameter to deploy heartbeat request for version"}],"source_content_type":"text/x-rst","patch_set":77,"id":"7f96bb07_9e890b76","line":17,"updated":"2018-01-18 21:59:55.000000000","message":"This shouldn\u0027t be changed, it is 10.0.0","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"it to ``active``. Added ``rescue_interface`` to the node object, to"},{"line_number":15,"context_line":"allow setting the rescue interface for a dynamic driver."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"1.36 (Queens, 9.3.0)"},{"line_number":18,"context_line":"--------------------"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Added ``agent_version`` parameter to deploy heartbeat request for version"}],"source_content_type":"text/x-rst","patch_set":77,"id":"7f96bb07_72d1c02f","line":17,"in_reply_to":"7f96bb07_9e890b76","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"}],"doc/source/dev/webapi-version-history.rst":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":11,"context_line":"    ramdisk, configured with the rescue_password, and listening with ssh"},{"line_number":12,"context_line":"    on the specified network interfaces. Unrescuing a node will return"},{"line_number":13,"context_line":"    it to ``active``."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"**1.25**"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a77a97e_621ed4bb","line":13,"updated":"2016-11-15 18:34:14.000000000","message":"It might be obvious, but there\u0027s no specification here that RESCUEWAIT will happen between active and rescue, or that UNRESCUING will happen between rescue and active.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"349c0cbbe98a87c5643f544a084948ffcd0c2889","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":11,"context_line":"    ramdisk, configured with the rescue_password, and listening with ssh"},{"line_number":12,"context_line":"    on the specified network interfaces. Unrescuing a node will return"},{"line_number":13,"context_line":"    it to ``active``."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"**1.25**"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a77a97e_3987d5d8","line":13,"in_reply_to":"7a77a97e_3702b90a","updated":"2016-11-21 16:09:18.000000000","message":"That should be good enough, +1","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":11,"context_line":"    ramdisk, configured with the rescue_password, and listening with ssh"},{"line_number":12,"context_line":"    on the specified network interfaces. Unrescuing a node will return"},{"line_number":13,"context_line":"    it to ``active``."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"**1.25**"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a77a97e_3702b90a","line":13,"in_reply_to":"7a77a97e_621ed4bb","updated":"2016-11-18 22:51:31.000000000","message":"I\u0027m hesitant to document the transition states here. The state diagram contains more than 15 transitions. I was going to update the state diagrams to include these new transitions, however.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"9f9d93183f03aac2e68dec196675351120da3934","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":11,"context_line":"    ramdisk, configured with the rescue_password, and listening with ssh"},{"line_number":12,"context_line":"    on the specified network interfaces. Unrescuing a node will return"},{"line_number":13,"context_line":"    it to ``active``."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"**1.25**"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"3a71b18c_77c30d8b","line":13,"updated":"2016-12-07 22:16:52.000000000","message":"you probably want to mention rescue_password argument here as well","commit_id":"359c6e92faa5181746754ddb59ddccea9a1d2769"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"e0bfa838874c0ca79d467827bbe11d75248779c5","unresolved":false,"context_lines":[{"line_number":2,"context_line":"REST API Version History"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.31** (Pike)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added provision_state verbs ``rescue`` and ``unrescue`` along with"},{"line_number":8,"context_line":"    the following states: ``rescue``, ``rescuefail``, ``rescuewait``,"}],"source_content_type":"text/x-rst","patch_set":29,"id":"3a461143_5e7bb329","line":5,"range":{"start_line":5,"start_character":0,"end_line":5,"end_character":15},"updated":"2017-02-01 19:27:38.000000000","message":"API version, 1.32 (Pike)?","commit_id":"8d4c56519b25df1d1b420c7b5ea70eb6c3b3a4a6"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"244ae10e9c6ce60fd77be3c2edf653b66e533244","unresolved":false,"context_lines":[{"line_number":2,"context_line":"REST API Version History"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.31** (Pike)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added provision_state verbs ``rescue`` and ``unrescue`` along with"},{"line_number":8,"context_line":"    the following states: ``rescue``, ``rescuefail``, ``rescuewait``,"}],"source_content_type":"text/x-rst","patch_set":29,"id":"3a461143_4d014739","line":5,"range":{"start_line":5,"start_character":0,"end_line":5,"end_character":15},"in_reply_to":"3a461143_5e7bb329","updated":"2017-02-01 21:27:11.000000000","message":"Done, nice catch","commit_id":"8d4c56519b25df1d1b420c7b5ea70eb6c3b3a4a6"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"d8e3d0e27052e6a0ba173661954b64b84d92e208","unresolved":false,"context_lines":[{"line_number":5,"context_line":"**1.32** (Pike)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added provision_state verbs ``rescue`` and ``unrescue`` along with"},{"line_number":8,"context_line":"    the following states: ``rescue``, ``rescuefail``, ``rescuewait``,"},{"line_number":9,"context_line":"    ``rescuing``, ``unrescuefail``, and ``unrescuing``.  After rescuing"},{"line_number":10,"context_line":"    a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":11,"context_line":"    ramdisk, configured with the rescue_password, and listening with ssh"},{"line_number":12,"context_line":"    on the specified network interfaces. Unrescuing a node will return"}],"source_content_type":"text/x-rst","patch_set":50,"id":"3f1d235d_73fa7abd","line":9,"range":{"start_line":8,"start_character":38,"end_line":9,"end_character":55},"updated":"2017-07-04 14:17:12.000000000","message":"We would alneed to rename provision states here.","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"87637f5000a5334e692e644331f7386e5f1c2639","unresolved":false,"context_lines":[{"line_number":5,"context_line":"**1.32** (Pike)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added provision_state verbs ``rescue`` and ``unrescue`` along with"},{"line_number":8,"context_line":"    the following states: ``rescue``, ``rescuefail``, ``rescuewait``,"},{"line_number":9,"context_line":"    ``rescuing``, ``unrescuefail``, and ``unrescuing``.  After rescuing"},{"line_number":10,"context_line":"    a node, it will be left in the ``rescue`` state running a rescue"},{"line_number":11,"context_line":"    ramdisk, configured with the rescue_password, and listening with ssh"},{"line_number":12,"context_line":"    on the specified network interfaces. Unrescuing a node will return"}],"source_content_type":"text/x-rst","patch_set":50,"id":"1f1a1f67_45026db6","line":9,"range":{"start_line":8,"start_character":38,"end_line":9,"end_character":55},"in_reply_to":"3f1d235d_73fa7abd","updated":"2017-07-13 10:39:56.000000000","message":"Done","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"}],"etc/ironic/ironic.conf.sample":[{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"6e579b80c4d42ba11b127ad70ce80bb0a8cb8d69","unresolved":false,"context_lines":[{"line_number":2088,"context_line":"#password \u003d"},{"line_number":2089,"context_line":""},{"line_number":2090,"context_line":"# DEPRECATED: List of Redis Sentinel hosts (fault tolerance"},{"line_number":2091,"context_line":"# mode) e.g.                [host:port, host1:port ... ] (list"},{"line_number":2092,"context_line":"# value)"},{"line_number":2093,"context_line":"# This option is deprecated for removal."},{"line_number":2094,"context_line":"# Its value may be silently ignored in the future."}],"source_content_type":"application/octet-stream","patch_set":32,"id":"9a30ddce_8a6e62ff","line":2091,"range":{"start_line":2091,"start_character":0,"end_line":2091,"end_character":62},"updated":"2017-03-09 05:20:21.000000000","message":"nit: no need to change; git rebase introduced some extra spaces; it reads better without the spaces.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d0ffd3190cc41e76f84f07c03f529a44cd4e7cfc","unresolved":false,"context_lines":[{"line_number":2088,"context_line":"#password \u003d"},{"line_number":2089,"context_line":""},{"line_number":2090,"context_line":"# DEPRECATED: List of Redis Sentinel hosts (fault tolerance"},{"line_number":2091,"context_line":"# mode) e.g.                [host:port, host1:port ... ] (list"},{"line_number":2092,"context_line":"# value)"},{"line_number":2093,"context_line":"# This option is deprecated for removal."},{"line_number":2094,"context_line":"# Its value may be silently ignored in the future."}],"source_content_type":"application/octet-stream","patch_set":32,"id":"9a30ddce_c50e693a","line":2091,"range":{"start_line":2091,"start_character":0,"end_line":2091,"end_character":62},"in_reply_to":"9a30ddce_8a6e62ff","updated":"2017-03-09 17:27:36.000000000","message":"this file is autogenerated, so I don\u0027t think this patch has anything to do with this change","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":2088,"context_line":"#password \u003d"},{"line_number":2089,"context_line":""},{"line_number":2090,"context_line":"# DEPRECATED: List of Redis Sentinel hosts (fault tolerance"},{"line_number":2091,"context_line":"# mode) e.g.                [host:port, host1:port ... ] (list"},{"line_number":2092,"context_line":"# value)"},{"line_number":2093,"context_line":"# This option is deprecated for removal."},{"line_number":2094,"context_line":"# Its value may be silently ignored in the future."}],"source_content_type":"application/octet-stream","patch_set":32,"id":"1a1ced50_71549120","line":2091,"range":{"start_line":2091,"start_character":0,"end_line":2091,"end_character":62},"in_reply_to":"9a30ddce_c50e693a","updated":"2017-03-21 19:16:54.000000000","message":"Correct, this is auto-generated (tox -egenconfig). Sometimes people land code without updating the generated config, so patches that regenerate it may have extra changes.\n\nI\u0027ve just rebased this change, so it will have the latest generated config from master.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"243fcd8a08742092a07498236f941b5553c38ed0","unresolved":false,"context_lines":[{"line_number":3680,"context_line":"# Minimum value: 0"},{"line_number":3681,"context_line":"#udp_transport_timeout \u003d 1.0"},{"line_number":3682,"context_line":""},{"line_number":3683,"context_line":"# Maximum number of UDP request retries, 0 means no retries."},{"line_number":3684,"context_line":"# (integer value)"},{"line_number":3685,"context_line":"# Minimum value: 0"},{"line_number":3686,"context_line":"#udp_transport_retries \u003d 5"}],"source_content_type":"application/octet-stream","patch_set":56,"id":"9f5c4f37_01213e4e","line":3683,"updated":"2017-09-21 03:45:21.000000000","message":"Unrelated, guess we landed a patch that edited the text and didn\u0027t get the sample config updated :(\n\nI\u0027m okay with it still being here :)","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"}],"ironic/api/controllers/v1/driver.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"8c73067fd752f49b50437fef6291f94f0dfdaafc","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    if not api_utils.allow_storage_interface():"},{"line_number":75,"context_line":"        obj.default_storage_interface \u003d wsme.Unset"},{"line_number":76,"context_line":"        obj.enabled_storage_interfaces \u003d wsme.Unset"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class Driver(base.APIBase):"},{"line_number":80,"context_line":"    \"\"\"API representation of a driver.\"\"\""}],"source_content_type":"text/x-python","patch_set":55,"id":"7f287b81_c42dd095","line":77,"updated":"2017-09-08 08:43:33.000000000","message":"It is necessary to hide rescue_interface here.","commit_id":"8a0b03656b4ad30916efb14dd28e0df296ede593"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"68cbf78e6194993a3508372f5961541bf316be15","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    if not api_utils.allow_storage_interface():"},{"line_number":75,"context_line":"        obj.default_storage_interface \u003d wsme.Unset"},{"line_number":76,"context_line":"        obj.enabled_storage_interfaces \u003d wsme.Unset"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class Driver(base.APIBase):"},{"line_number":80,"context_line":"    \"\"\"API representation of a driver.\"\"\""}],"source_content_type":"text/x-python","patch_set":55,"id":"5f2577a7_4eb1948f","line":77,"in_reply_to":"7f287b81_c42dd095","updated":"2017-09-12 04:34:06.000000000","message":"Done","commit_id":"8a0b03656b4ad30916efb14dd28e0df296ede593"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"5866a02d86ec4722889fdb7f2a5f17da10168348","unresolved":false,"context_lines":[{"line_number":553,"context_line":"            pecan.request.rpcapi.do_node_deploy(pecan.request.context,"},{"line_number":554,"context_line":"                                                rpc_node.uuid, True,"},{"line_number":555,"context_line":"                                                None, topic)"},{"line_number":556,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027unrescue\u0027] and"},{"line_number":557,"context_line":"              rpc_node.provision_state in (ir_states.RESCUE,"},{"line_number":558,"context_line":"                                           ir_states.RESCUEFAIL)):"},{"line_number":559,"context_line":"                pecan.request.rpcapi.do_node_unrescue("}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_b25bc4f5","line":556,"updated":"2016-08-04 00:18:56.000000000","message":"Need to bump API microversion","commit_id":"6faafe92a65b459d25024018366b06fc0528606b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"be3281a373a800417d24d6bb2966a6b1a30acebe","unresolved":false,"context_lines":[{"line_number":590,"context_line":"                                             ir_states.RESCUE,"},{"line_number":591,"context_line":"                                             ir_states.RESCUEFAIL,"},{"line_number":592,"context_line":"                                             ir_states.RESCUEWAIT,"},{"line_number":593,"context_line":"                                             ir_states.UNRESCUEFAIL,"},{"line_number":594,"context_line":"                                             )):"},{"line_number":595,"context_line":"            pecan.request.rpcapi.do_node_rescue("},{"line_number":596,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_16d1c957","line":593,"updated":"2016-10-28 20:06:46.000000000","message":"Can we do a states.VALID_RESCUE_STATES or something here?","commit_id":"6366247f6c230c6b281c5449f31b02ae28001f9c"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"289200ffc00d445b7d98a9baaac63977028b98a2","unresolved":false,"context_lines":[{"line_number":590,"context_line":"                                             ir_states.RESCUE,"},{"line_number":591,"context_line":"                                             ir_states.RESCUEFAIL,"},{"line_number":592,"context_line":"                                             ir_states.RESCUEWAIT,"},{"line_number":593,"context_line":"                                             ir_states.UNRESCUEFAIL,"},{"line_number":594,"context_line":"                                             )):"},{"line_number":595,"context_line":"            pecan.request.rpcapi.do_node_rescue("},{"line_number":596,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_9b0ff22d","line":593,"in_reply_to":"ba5da102_16d1c957","updated":"2016-11-04 19:22:22.000000000","message":"I think I actually prefer it as is, but I don\u0027t have that strong of an opinion so I went ahead and added VALID_RESCUE_STATES and VALID_UNRESCUE_STATES.","commit_id":"6366247f6c230c6b281c5449f31b02ae28001f9c"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"be3281a373a800417d24d6bb2966a6b1a30acebe","unresolved":false,"context_lines":[{"line_number":593,"context_line":"                                             ir_states.UNRESCUEFAIL,"},{"line_number":594,"context_line":"                                             )):"},{"line_number":595,"context_line":"            pecan.request.rpcapi.do_node_rescue("},{"line_number":596,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":597,"context_line":"        elif target \u003d\u003d ir_states.DELETED:"},{"line_number":598,"context_line":"            pecan.request.rpcapi.do_node_tear_down("},{"line_number":599,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_b6cd7d5f","line":596,"updated":"2016-10-28 20:06:46.000000000","message":"Also, going to need to bump API microversion.","commit_id":"6366247f6c230c6b281c5449f31b02ae28001f9c"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"289200ffc00d445b7d98a9baaac63977028b98a2","unresolved":false,"context_lines":[{"line_number":593,"context_line":"                                             ir_states.UNRESCUEFAIL,"},{"line_number":594,"context_line":"                                             )):"},{"line_number":595,"context_line":"            pecan.request.rpcapi.do_node_rescue("},{"line_number":596,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":597,"context_line":"        elif target \u003d\u003d ir_states.DELETED:"},{"line_number":598,"context_line":"            pecan.request.rpcapi.do_node_tear_down("},{"line_number":599,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_9b3612e6","line":596,"in_reply_to":"ba5da102_b6cd7d5f","updated":"2016-11-04 19:22:22.000000000","message":"That was a fun little adventure :) Done.","commit_id":"6366247f6c230c6b281c5449f31b02ae28001f9c"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"f178af7b54f58ed4d020bf3434519a8e246d0eee","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                api_utils.allow_rescue()):"},{"line_number":583,"context_line":"            pecan.request.rpcapi.do_node_unrescue("},{"line_number":584,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":585,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027] and"},{"line_number":586,"context_line":"                api_utils.allow_rescue()):"},{"line_number":587,"context_line":"            pecan.request.rpcapi.do_node_rescue("},{"line_number":588,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_bcb82c2c","line":585,"updated":"2016-12-07 21:47:03.000000000","message":"like we talked about over video, per the spec; this must accept a rescue_password argument -- none is being added to this method, and there\u0027s no validation for it here","commit_id":"359c6e92faa5181746754ddb59ddccea9a1d2769"},{"author":{"_account_id":22931,"name":"Taku Izumi","email":"izumi.taku@jp.fujitsu.com","username":"izumi777"},"change_message_id":"adce27a6fe16e73952446dd951a6caf6fe8e140c","unresolved":false,"context_lines":[{"line_number":478,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":479,"context_line":"                   wtypes.text, types.jsontype,"},{"line_number":480,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":481,"context_line":"    def provision(self, node_ident, target, configdrive\u003dNone,"},{"line_number":482,"context_line":"                  clean_steps\u003dNone):"},{"line_number":483,"context_line":"        \"\"\"Asynchronous trigger the provisioning of the node."},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        This will set the target provision state of the node, and a"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_b5071680","line":482,"range":{"start_line":481,"start_character":0,"end_line":482,"end_character":36},"updated":"2016-12-09 10:17:35.000000000","message":"You should add \"rescue_password\u003dNone\" as a parameter to accept rescue password parameter, right ?","commit_id":"901dd80eeea6a2e16d411e178fea90bf3dc9e377"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"fd18667182cef5a5492adbe46d9f557bb21ae77e","unresolved":false,"context_lines":[{"line_number":515,"context_line":"            This is required (and only valid) when target is \"clean\"."},{"line_number":516,"context_line":"        :param rescue_password: A string representing the password to be set"},{"line_number":517,"context_line":"            inside the rescue environment. This is required (and only valid),"},{"line_number":518,"context_line":"            when target is \"clean\"."},{"line_number":519,"context_line":"        :raises: NodeLocked (HTTP 409) if the node is currently locked."},{"line_number":520,"context_line":"        :raises: ClientSideError (HTTP 409) if the node is already being"},{"line_number":521,"context_line":"                 provisioned."}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_8f8651d9","line":518,"range":{"start_line":518,"start_character":28,"end_line":518,"end_character":33},"updated":"2017-01-04 20:44:21.000000000","message":"when target is \"rescue\"","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"e0415c163aaef403561e27091c87e434312b9619","unresolved":false,"context_lines":[{"line_number":515,"context_line":"            This is required (and only valid) when target is \"clean\"."},{"line_number":516,"context_line":"        :param rescue_password: A string representing the password to be set"},{"line_number":517,"context_line":"            inside the rescue environment. This is required (and only valid),"},{"line_number":518,"context_line":"            when target is \"clean\"."},{"line_number":519,"context_line":"        :raises: NodeLocked (HTTP 409) if the node is currently locked."},{"line_number":520,"context_line":"        :raises: ClientSideError (HTTP 409) if the node is already being"},{"line_number":521,"context_line":"                 provisioned."}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_15ba6e0a","line":518,"range":{"start_line":518,"start_character":28,"end_line":518,"end_character":33},"in_reply_to":"ba5201f7_8f8651d9","updated":"2017-01-04 23:01:29.000000000","message":"Oops. Done.","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"6e579b80c4d42ba11b127ad70ce80bb0a8cb8d69","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        obj.resource_class \u003d wsme.Unset"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    if not api_utils.allow_dynamic_interfaces():"},{"line_number":152,"context_line":"        for field in api_utils.V31_FIELDS + api_utils.V32_FIELDS:"},{"line_number":153,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    if not api_utils.allow_rescue():"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_2d4bd0b1","line":152,"range":{"start_line":152,"start_character":41,"end_line":152,"end_character":64},"updated":"2017-03-09 05:20:21.000000000","message":"I don\u0027t see clearly why V32_FIELDS are unset here. Suppose, a new \u0027interface field\u0027 is added in V33_FIELDS, would it be necessary to unset V33_FIELDS here also?\n\nI found this comment but still not clear. https://review.openstack.org/#/c/350831/32/ironic/tests/unit/api/v1/test_nodes.py@1909.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d0ffd3190cc41e76f84f07c03f529a44cd4e7cfc","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        obj.resource_class \u003d wsme.Unset"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    if not api_utils.allow_dynamic_interfaces():"},{"line_number":152,"context_line":"        for field in api_utils.V31_FIELDS + api_utils.V32_FIELDS:"},{"line_number":153,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    if not api_utils.allow_rescue():"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_c90cc33d","line":152,"range":{"start_line":152,"start_character":41,"end_line":152,"end_character":64},"in_reply_to":"9a30ddce_2d4bd0b1","updated":"2017-03-09 17:27:36.000000000","message":"Yeah perhaps a similar comment here would make it easy to understand.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        obj.resource_class \u003d wsme.Unset"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    if not api_utils.allow_dynamic_interfaces():"},{"line_number":152,"context_line":"        for field in api_utils.V31_FIELDS + api_utils.V32_FIELDS:"},{"line_number":153,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    if not api_utils.allow_rescue():"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_04d15d23","line":152,"range":{"start_line":152,"start_character":41,"end_line":152,"end_character":64},"in_reply_to":"9a30ddce_c90cc33d","updated":"2017-03-21 19:16:54.000000000","message":"I believe setting to wsme.Unset is needed whenever you have a new attribute on the API object that isn\u0027t supported with all API versions. Docstring on L121 indicates this.\n\nV32_FIELDS specifically is needed for the dynamic driver case because this is a new node interface (rescue_interface). For other changes to a node (\"V33_FIELDS\"), you can guard them with a new if statement since they will likely not be new node interfaces.\n\nI will add a comment indicating that here.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2fea75de3cb043375e5954a395563dd75b724bac","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        for field in api_utils.V31_FIELDS + api_utils.V32_FIELDS:"},{"line_number":153,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    if not api_utils.allow_rescue():"},{"line_number":156,"context_line":"        for field in api_utils.V32_FIELDS:"},{"line_number":157,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"def update_state_in_older_versions(obj):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_4acd615c","line":157,"range":{"start_line":155,"start_character":0,"end_line":157,"end_character":43},"updated":"2017-03-08 11:35:01.000000000","message":"This is not needed, if we enter this conditional here ( if not allow_rescue ) we will also have entered the previous one and the V32_fields was hid there already.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        for field in api_utils.V31_FIELDS + api_utils.V32_FIELDS:"},{"line_number":153,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    if not api_utils.allow_rescue():"},{"line_number":156,"context_line":"        for field in api_utils.V32_FIELDS:"},{"line_number":157,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"def update_state_in_older_versions(obj):"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_e45a8129","line":157,"range":{"start_line":155,"start_character":0,"end_line":157,"end_character":43},"in_reply_to":"9a30ddce_4acd615c","updated":"2017-03-21 19:16:54.000000000","message":"Nice catch. You\u0027re right since rescue version \u003e dynamic interfaces version.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2fea75de3cb043375e5954a395563dd75b724bac","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":662,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027] and"},{"line_number":663,"context_line":"                api_utils.allow_rescue()):"},{"line_number":664,"context_line":"            if not rescue_password:"},{"line_number":665,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":666,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":667,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":668,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":669,"context_line":"            pecan.request.rpcapi.do_node_rescue("},{"line_number":670,"context_line":"                pecan.request.context, rpc_node.uuid, rescue_password, topic)"},{"line_number":671,"context_line":"        elif target \u003d\u003d ir_states.DELETED:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_275f8842","line":668,"range":{"start_line":664,"start_character":0,"end_line":668,"end_character":61},"updated":"2017-03-08 11:35:01.000000000","message":"Just a note, this will also prevent empty passwords (\u0027\u0027), tho not recommended they are still valid passwords.\n\nIf that\u0027s not the intention we can check for None, which is the placeholder:\n\n if rescue_password is None:\n    ...","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":662,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027] and"},{"line_number":663,"context_line":"                api_utils.allow_rescue()):"},{"line_number":664,"context_line":"            if not rescue_password:"},{"line_number":665,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":666,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":667,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":668,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":669,"context_line":"            pecan.request.rpcapi.do_node_rescue("},{"line_number":670,"context_line":"                pecan.request.context, rpc_node.uuid, rescue_password, topic)"},{"line_number":671,"context_line":"        elif target \u003d\u003d ir_states.DELETED:"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_84b8edc9","line":668,"range":{"start_line":664,"start_character":0,"end_line":668,"end_character":61},"in_reply_to":"9a30ddce_275f8842","updated":"2017-03-21 19:16:54.000000000","message":"Nice catch, it was not my intention to disallow empty passwords. Changed.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ecfbf97b5c89dd20e3c0517ae4d03047a9f7f87a","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    if not api_utils.allow_dynamic_interfaces():"},{"line_number":152,"context_line":"        # NOTE(mariojv): Unsetting V32_FIELDS is needed here since V32_FIELDS"},{"line_number":153,"context_line":"        # includes a new dynamic driver interface (\"rescue_interface\")."},{"line_number":154,"context_line":"        for field in api_utils.V31_FIELDS + api_utils.V32_FIELDS:"},{"line_number":155,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"bff0334d_398475d2","line":154,"range":{"start_line":154,"start_character":44,"end_line":154,"end_character":64},"updated":"2017-04-12 17:26:38.000000000","message":"I suppose you have to check this separately, as it should be displayed only in 1.32, not in 1.31","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bbda48af85f136be9004a041c8d4013cb36ba3ee","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    if not api_utils.allow_dynamic_interfaces():"},{"line_number":152,"context_line":"        # NOTE(mariojv): Unsetting V32_FIELDS is needed here since V32_FIELDS"},{"line_number":153,"context_line":"        # includes a new dynamic driver interface (\"rescue_interface\")."},{"line_number":154,"context_line":"        for field in api_utils.V31_FIELDS + api_utils.V32_FIELDS:"},{"line_number":155,"context_line":"            setattr(obj, field, wsme.Unset)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1f013ff3_ab5555c8","line":154,"range":{"start_line":154,"start_character":44,"end_line":154,"end_character":64},"in_reply_to":"bff0334d_398475d2","updated":"2017-05-17 11:02:34.000000000","message":"Done","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ecfbf97b5c89dd20e3c0517ae4d03047a9f7f87a","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":598,"context_line":"        policy.authorize(\u0027baremetal:node:set_provision_state\u0027, cdict, cdict)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        api_utils.check_allow_management_verbs(target)"},{"line_number":601,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":602,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":603,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"bff0334d_b0b1b246","line":600,"range":{"start_line":600,"start_character":18,"end_line":600,"end_character":46},"updated":"2017-04-12 17:26:38.000000000","message":"this one needs to change too","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bbda48af85f136be9004a041c8d4013cb36ba3ee","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":598,"context_line":"        policy.authorize(\u0027baremetal:node:set_provision_state\u0027, cdict, cdict)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        api_utils.check_allow_management_verbs(target)"},{"line_number":601,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":602,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":603,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1f013ff3_ae1eac09","line":600,"range":{"start_line":600,"start_character":18,"end_line":600,"end_character":46},"in_reply_to":"bff0334d_b0b1b246","updated":"2017-05-17 11:02:34.000000000","message":"Done","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ecfbf97b5c89dd20e3c0517ae4d03047a9f7f87a","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":637,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"        if rescue_password and target !\u003d ir_states.VERBS[\u0027rescue\u0027]:"},{"line_number":640,"context_line":"            msg \u003d (_(\u0027\"rescue_password\" is only valid when setting target \u0027"},{"line_number":641,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":642,"context_line":"            raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":39,"id":"bff0334d_f9528d66","line":639,"range":{"start_line":639,"start_character":11,"end_line":639,"end_character":26},"updated":"2017-04-12 17:26:38.000000000","message":"\"is not None\" here please","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bbda48af85f136be9004a041c8d4013cb36ba3ee","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":637,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"        if rescue_password and target !\u003d ir_states.VERBS[\u0027rescue\u0027]:"},{"line_number":640,"context_line":"            msg \u003d (_(\u0027\"rescue_password\" is only valid when setting target \u0027"},{"line_number":641,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":642,"context_line":"            raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":39,"id":"1f013ff3_ce21f84f","line":639,"range":{"start_line":639,"start_character":11,"end_line":639,"end_character":26},"in_reply_to":"bff0334d_f9528d66","updated":"2017-05-17 11:02:34.000000000","message":"Done","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"f98548097cb863f8668ddab19c32f53053199695","unresolved":false,"context_lines":[{"line_number":1617,"context_line":"                if getattr(node, field) is not wsme.Unset:"},{"line_number":1618,"context_line":"                    raise exception.NotAcceptable()"},{"line_number":1619,"context_line":""},{"line_number":1620,"context_line":"        if not api_utils.allow_rescue():"},{"line_number":1621,"context_line":"            if getattr(node, api_utils.V32_FIELD) is not wsme.Unset:"},{"line_number":1622,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1623,"context_line":""},{"line_number":1624,"context_line":"        # NOTE(deva): get_topic_for checks if node.driver is in the hash ring"},{"line_number":1625,"context_line":"        #             and raises NoValidHost if it is not."}],"source_content_type":"text/x-python","patch_set":50,"id":"3f1d235d_acce3b60","line":1622,"range":{"start_line":1620,"start_character":8,"end_line":1622,"end_character":47},"updated":"2017-07-06 02:12:26.000000000","message":"can we call check_allowed_fields() here and remove individual check?","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"87637f5000a5334e692e644331f7386e5f1c2639","unresolved":false,"context_lines":[{"line_number":1617,"context_line":"                if getattr(node, field) is not wsme.Unset:"},{"line_number":1618,"context_line":"                    raise exception.NotAcceptable()"},{"line_number":1619,"context_line":""},{"line_number":1620,"context_line":"        if not api_utils.allow_rescue():"},{"line_number":1621,"context_line":"            if getattr(node, api_utils.V32_FIELD) is not wsme.Unset:"},{"line_number":1622,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1623,"context_line":""},{"line_number":1624,"context_line":"        # NOTE(deva): get_topic_for checks if node.driver is in the hash ring"},{"line_number":1625,"context_line":"        #             and raises NoValidHost if it is not."}],"source_content_type":"text/x-python","patch_set":50,"id":"1f1a1f67_29a50b05","line":1622,"range":{"start_line":1620,"start_character":8,"end_line":1622,"end_character":47},"in_reply_to":"3f1d235d_acce3b60","updated":"2017-07-13 10:39:56.000000000","message":"I agree with Hironori.","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"3c4e6e83834a255bc433bbeafe4cb90cbb17d5f6","unresolved":false,"context_lines":[{"line_number":1617,"context_line":"                if getattr(node, field) is not wsme.Unset:"},{"line_number":1618,"context_line":"                    raise exception.NotAcceptable()"},{"line_number":1619,"context_line":""},{"line_number":1620,"context_line":"        if not api_utils.allow_rescue():"},{"line_number":1621,"context_line":"            if getattr(node, api_utils.V32_FIELD) is not wsme.Unset:"},{"line_number":1622,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1623,"context_line":""},{"line_number":1624,"context_line":"        # NOTE(deva): get_topic_for checks if node.driver is in the hash ring"},{"line_number":1625,"context_line":"        #             and raises NoValidHost if it is not."}],"source_content_type":"text/x-python","patch_set":50,"id":"3f1d235d_2c14b59f","line":1622,"range":{"start_line":1620,"start_character":8,"end_line":1622,"end_character":47},"in_reply_to":"3f1d235d_acce3b60","updated":"2017-07-12 06:57:32.000000000","message":"I don\u0027t think check_allowed_field() is available since this method is used to check a list of field names. It is not for Node object.","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"f98548097cb863f8668ddab19c32f53053199695","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"                if api_utils.get_patch_values(patch, \u0027/%s\u0027 % field):"},{"line_number":1686,"context_line":"                    raise exception.NotAcceptable()"},{"line_number":1687,"context_line":""},{"line_number":1688,"context_line":"        if not api_utils.allow_rescue():"},{"line_number":1689,"context_line":"            if api_utils.get_patch_values(patch, \u0027/%s\u0027 % api_utils.V32_FIELD):"},{"line_number":1690,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1691,"context_line":""},{"line_number":1692,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":1693,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"3f1d235d_6cc4a340","line":1690,"range":{"start_line":1688,"start_character":8,"end_line":1690,"end_character":47},"updated":"2017-07-06 02:12:26.000000000","message":"ditto","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"8c73067fd752f49b50437fef6291f94f0dfdaafc","unresolved":false,"context_lines":[{"line_number":660,"context_line":"                                                None, topic)"},{"line_number":661,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027unrescue\u0027] and"},{"line_number":662,"context_line":"                api_utils.allow_rescue()):"},{"line_number":663,"context_line":"            pecan.request.rpcapi.do_node_unrescue("},{"line_number":664,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":665,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027] and"},{"line_number":666,"context_line":"                api_utils.allow_rescue()):"}],"source_content_type":"text/x-python","patch_set":55,"id":"7f287b81_2a457db4","line":663,"updated":"2017-09-08 08:43:33.000000000","message":"For supporting rolling upgrades, we need to confirm that a new RPC API is allowed like this[1].\n\n[1] https://review.openstack.org/#/c/485773/","commit_id":"8a0b03656b4ad30916efb14dd28e0df296ede593"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"68cbf78e6194993a3508372f5961541bf316be15","unresolved":false,"context_lines":[{"line_number":660,"context_line":"                                                None, topic)"},{"line_number":661,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027unrescue\u0027] and"},{"line_number":662,"context_line":"                api_utils.allow_rescue()):"},{"line_number":663,"context_line":"            pecan.request.rpcapi.do_node_unrescue("},{"line_number":664,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":665,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027] and"},{"line_number":666,"context_line":"                api_utils.allow_rescue()):"}],"source_content_type":"text/x-python","patch_set":55,"id":"5f2577a7_1999816d","line":663,"in_reply_to":"7f287b81_2a457db4","updated":"2017-09-12 04:34:06.000000000","message":"Done","commit_id":"8a0b03656b4ad30916efb14dd28e0df296ede593"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"c5f3fd60f3e44e165ffc578eaf973199164ab705","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        obj.storage_interface \u003d wsme.Unset"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if not api_utils.allow_rescue():"},{"line_number":161,"context_line":"        setattr(obj, api_utils.V35_FIELD, wsme.Unset)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"def update_state_in_older_versions(obj):"}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_e25ef1e4","line":161,"range":{"start_line":161,"start_character":31,"end_line":161,"end_character":40},"updated":"2017-09-25 08:30:25.000000000","message":"For a single field, I like the style like L158, V35_FIELD is not intuitive, not insisting.","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8bcc0867d5f005065b09d0e8383e29dfa5d93135","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        obj.storage_interface \u003d wsme.Unset"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if not api_utils.allow_rescue():"},{"line_number":161,"context_line":"        setattr(obj, api_utils.V35_FIELD, wsme.Unset)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"def update_state_in_older_versions(obj):"}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_38a1dcaa","line":161,"range":{"start_line":161,"start_character":31,"end_line":161,"end_character":40},"in_reply_to":"7f515b1d_e25ef1e4","updated":"2017-09-27 16:27:36.000000000","message":"Done","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"c5f3fd60f3e44e165ffc578eaf973199164ab705","unresolved":false,"context_lines":[{"line_number":667,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":668,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]"},{"line_number":669,"context_line":"              and api_utils.allow_rescue()):"},{"line_number":670,"context_line":"            if rescue_password is None:"},{"line_number":671,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":672,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":673,"context_line":"                raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_c28895c7","line":670,"range":{"start_line":670,"start_character":15,"end_line":670,"end_character":30},"updated":"2017-09-25 08:30:25.000000000","message":"Does nova force the rescue password to be mandatory?\nIf not, I think we shouldn\u0027t impose on users, for it\u0027s  possible to utilize an unauthenticated ramdisk in practice.","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5c335d159b533bdcf0a98e9b4743431ea82bfc39","unresolved":false,"context_lines":[{"line_number":667,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":668,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]"},{"line_number":669,"context_line":"              and api_utils.allow_rescue()):"},{"line_number":670,"context_line":"            if rescue_password is None:"},{"line_number":671,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":672,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":673,"context_line":"                raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_7e47e34d","line":670,"range":{"start_line":670,"start_character":15,"end_line":670,"end_character":30},"in_reply_to":"7f515b1d_1894e036","updated":"2017-10-09 08:46:47.000000000","message":"Get it, I raise this is because some customers use Windows as guest os, password is not required (actually, no such mechanism at all) for rescuing with Windows PE.","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8bcc0867d5f005065b09d0e8383e29dfa5d93135","unresolved":false,"context_lines":[{"line_number":667,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":668,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]"},{"line_number":669,"context_line":"              and api_utils.allow_rescue()):"},{"line_number":670,"context_line":"            if rescue_password is None:"},{"line_number":671,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":672,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":673,"context_line":"                raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_1894e036","line":670,"range":{"start_line":670,"start_character":15,"end_line":670,"end_character":30},"in_reply_to":"7f515b1d_c28895c7","updated":"2017-09-27 16:27:36.000000000","message":"Its more of security feature. It is part of spec. Will leave it like that unless other folks also want it to be without password. Then we might need a spec change for the same.","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"c5f3fd60f3e44e165ffc578eaf973199164ab705","unresolved":false,"context_lines":[{"line_number":1647,"context_line":"                node.storage_interface is not wtypes.Unset):"},{"line_number":1648,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1649,"context_line":""},{"line_number":1650,"context_line":"        if not api_utils.allow_rescue():"},{"line_number":1651,"context_line":"            if getattr(node, api_utils.V35_FIELD) is not wsme.Unset:"},{"line_number":1652,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1653,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_02cc6dba","line":1650,"range":{"start_line":1650,"start_character":25,"end_line":1650,"end_character":37},"updated":"2017-09-25 08:30:25.000000000","message":"I\u0027m kind of feel we should use allow_rescue_interface to keep consistent with other dynamic interfaces.\nallow rescue and allow rescue interface, I think they are slightly different.","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8bcc0867d5f005065b09d0e8383e29dfa5d93135","unresolved":false,"context_lines":[{"line_number":1647,"context_line":"                node.storage_interface is not wtypes.Unset):"},{"line_number":1648,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1649,"context_line":""},{"line_number":1650,"context_line":"        if not api_utils.allow_rescue():"},{"line_number":1651,"context_line":"            if getattr(node, api_utils.V35_FIELD) is not wsme.Unset:"},{"line_number":1652,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1653,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_58edb8ed","line":1650,"range":{"start_line":1650,"start_character":25,"end_line":1650,"end_character":37},"in_reply_to":"7f515b1d_02cc6dba","updated":"2017-09-27 16:27:36.000000000","message":"Done","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"70024ca3782b11bf402b7876cbaee0be52898966","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                pecan.request.rpcapi.do_node_unrescue("},{"line_number":662,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":663,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]"},{"line_number":664,"context_line":"              and api_utils.allow_rescue_interface()):"},{"line_number":665,"context_line":"            if rescue_password is None:"},{"line_number":666,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":667,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"}],"source_content_type":"text/x-python","patch_set":65,"id":"1f485f77_20460551","line":664,"updated":"2017-11-15 08:45:30.000000000","message":"This is not necessary because version checks for verbs is already done in line 605. It would be better to add a unit test to request rescue with older version.\n\nditto to unrescue after adding the verb is added to MIN_VERB_VERSIONS in utils.","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5c5b7de06b7cd9afc0e0f6db88e0e9f66bbf20d8","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                pecan.request.rpcapi.do_node_unrescue("},{"line_number":662,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":663,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]"},{"line_number":664,"context_line":"              and api_utils.allow_rescue_interface()):"},{"line_number":665,"context_line":"            if rescue_password is None:"},{"line_number":666,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":667,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"}],"source_content_type":"text/x-python","patch_set":65,"id":"1f485f77_bb153f42","line":664,"in_reply_to":"1f485f77_20460551","updated":"2017-11-24 14:57:52.000000000","message":"Done","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"70024ca3782b11bf402b7876cbaee0be52898966","unresolved":false,"context_lines":[{"line_number":1599,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_uuid or node)"},{"line_number":1600,"context_line":""},{"line_number":1601,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1602,"context_line":"        return pecan.request.rpcapi.validate_driver_interfaces("},{"line_number":1603,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1604,"context_line":""},{"line_number":1605,"context_line":"    @METRICS.timer(\u0027NodesController.get_one\u0027)"}],"source_content_type":"text/x-python","patch_set":65,"id":"3f4b6375_36c81953","line":1602,"updated":"2017-11-15 08:45:30.000000000","message":"I wonder if we should remove rescue from the result when the API version doesn\u0027t allow rescue though some interfaces which was added in the past such as network_interface and storage_interface are not hidden.","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5c5b7de06b7cd9afc0e0f6db88e0e9f66bbf20d8","unresolved":false,"context_lines":[{"line_number":1599,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_uuid or node)"},{"line_number":1600,"context_line":""},{"line_number":1601,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1602,"context_line":"        return pecan.request.rpcapi.validate_driver_interfaces("},{"line_number":1603,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1604,"context_line":""},{"line_number":1605,"context_line":"    @METRICS.timer(\u0027NodesController.get_one\u0027)"}],"source_content_type":"text/x-python","patch_set":65,"id":"1f485f77_3becaf28","line":1602,"in_reply_to":"3f4b6375_36c81953","updated":"2017-11-24 14:57:52.000000000","message":"Done","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"f7930b48d3efe1a04503c31e638c473ba80e38f4","unresolved":false,"context_lines":[{"line_number":1601,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1602,"context_line":"        if not api_utils.allow_rescue_interface():"},{"line_number":1603,"context_line":"            result.pop(\u0027rescue\u0027, None)"},{"line_number":1604,"context_line":"            return result"},{"line_number":1605,"context_line":""},{"line_number":1606,"context_line":"    @METRICS.timer(\u0027NodesController.get_one\u0027)"},{"line_number":1607,"context_line":"    @expose.expose(Node, types.uuid_or_name, types.listtype)"}],"source_content_type":"text/x-python","patch_set":66,"id":"ff82abbf_92064c1c","line":1604,"updated":"2017-11-24 04:24:26.000000000","message":"This will return None if allows rescue interface.","commit_id":"ba9f7bcc8e864afdf947399406950431693a3a78"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"a41a1b4f9479eff3e28cb66d4bd771a2152df8ca","unresolved":false,"context_lines":[{"line_number":1601,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1602,"context_line":"        if not api_utils.allow_rescue_interface():"},{"line_number":1603,"context_line":"            result.pop(\u0027rescue\u0027, None)"},{"line_number":1604,"context_line":"            return result"},{"line_number":1605,"context_line":""},{"line_number":1606,"context_line":"    @METRICS.timer(\u0027NodesController.get_one\u0027)"},{"line_number":1607,"context_line":"    @expose.expose(Node, types.uuid_or_name, types.listtype)"}],"source_content_type":"text/x-python","patch_set":66,"id":"ff82abbf_7454c221","line":1604,"in_reply_to":"ff82abbf_0732f45f","updated":"2017-11-25 10:33:09.000000000","message":"I mean the \"return\" statement should be out side of the \"if\" statement.","commit_id":"ba9f7bcc8e864afdf947399406950431693a3a78"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5c5b7de06b7cd9afc0e0f6db88e0e9f66bbf20d8","unresolved":false,"context_lines":[{"line_number":1601,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1602,"context_line":"        if not api_utils.allow_rescue_interface():"},{"line_number":1603,"context_line":"            result.pop(\u0027rescue\u0027, None)"},{"line_number":1604,"context_line":"            return result"},{"line_number":1605,"context_line":""},{"line_number":1606,"context_line":"    @METRICS.timer(\u0027NodesController.get_one\u0027)"},{"line_number":1607,"context_line":"    @expose.expose(Node, types.uuid_or_name, types.listtype)"}],"source_content_type":"text/x-python","patch_set":66,"id":"ff82abbf_0732f45f","line":1604,"in_reply_to":"ff82abbf_92064c1c","updated":"2017-11-24 14:57:52.000000000","message":"No. We are not returning the poppped item. It would return all except \u0027rescue\u0027 results.","commit_id":"ba9f7bcc8e864afdf947399406950431693a3a78"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":660,"context_line":"                pecan.request.rpcapi.do_node_unrescue("},{"line_number":661,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":662,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]):"},{"line_number":663,"context_line":"            if rescue_password is None:"},{"line_number":664,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":665,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":666,"context_line":"                raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":67,"id":"ff82abbf_ac5de179","line":663,"updated":"2017-11-28 23:09:45.000000000","message":"just to confirm, is it ok if the rescue_password is \"\" ? or \" \"?","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":660,"context_line":"                pecan.request.rpcapi.do_node_unrescue("},{"line_number":661,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":662,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]):"},{"line_number":663,"context_line":"            if rescue_password is None:"},{"line_number":664,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":665,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":666,"context_line":"                raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":67,"id":"df87a7cf_e976373f","line":663,"in_reply_to":"ff82abbf_ac5de179","updated":"2017-12-03 16:39:51.000000000","message":"It should be ok I suppose as this is an user input.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":1599,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1600,"context_line":"        result \u003d pecan.request.rpcapi.validate_driver_interfaces("},{"line_number":1601,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1602,"context_line":"        if not api_utils.allow_rescue_interface():"},{"line_number":1603,"context_line":"            result.pop(\u0027rescue\u0027, None)"},{"line_number":1604,"context_line":"            return result"},{"line_number":1605,"context_line":""}],"source_content_type":"text/x-python","patch_set":67,"id":"ff82abbf_6c011938","line":1602,"updated":"2017-11-28 23:09:45.000000000","message":"this is interesting. we are showing network \u0026 storage; should we? I think yes for network, not sure about storage. (outside the scope of this patch, just wondering)","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":1599,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1600,"context_line":"        result \u003d pecan.request.rpcapi.validate_driver_interfaces("},{"line_number":1601,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1602,"context_line":"        if not api_utils.allow_rescue_interface():"},{"line_number":1603,"context_line":"            result.pop(\u0027rescue\u0027, None)"},{"line_number":1604,"context_line":"            return result"},{"line_number":1605,"context_line":""}],"source_content_type":"text/x-python","patch_set":67,"id":"df87a7cf_a98eef24","line":1602,"in_reply_to":"ff82abbf_6c011938","updated":"2017-12-03 16:39:51.000000000","message":"Yes, we should hide \u0027storage\u0027. May be I can push a separate patch for the same.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"a41a1b4f9479eff3e28cb66d4bd771a2152df8ca","unresolved":false,"context_lines":[{"line_number":1601,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1602,"context_line":"        if not api_utils.allow_rescue_interface():"},{"line_number":1603,"context_line":"            result.pop(\u0027rescue\u0027, None)"},{"line_number":1604,"context_line":"            return result"},{"line_number":1605,"context_line":""},{"line_number":1606,"context_line":"    @METRICS.timer(\u0027NodesController.get_one\u0027)"},{"line_number":1607,"context_line":"    @expose.expose(Node, types.uuid_or_name, types.listtype)"}],"source_content_type":"text/x-python","patch_set":67,"id":"ff82abbf_34387aed","line":1604,"updated":"2017-11-25 10:33:09.000000000","message":"In PS66, I mean the \"return\" statement should be out side of the \"if\" block.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"27ce047c9277fbeb42f2729e642ce751535d7714","unresolved":false,"context_lines":[{"line_number":1601,"context_line":"            pecan.request.context, rpc_node.uuid, topic)"},{"line_number":1602,"context_line":"        if not api_utils.allow_rescue_interface():"},{"line_number":1603,"context_line":"            result.pop(\u0027rescue\u0027, None)"},{"line_number":1604,"context_line":"            return result"},{"line_number":1605,"context_line":""},{"line_number":1606,"context_line":"    @METRICS.timer(\u0027NodesController.get_one\u0027)"},{"line_number":1607,"context_line":"    @expose.expose(Node, types.uuid_or_name, types.listtype)"}],"source_content_type":"text/x-python","patch_set":67,"id":"ff82abbf_67e40fe2","line":1604,"in_reply_to":"ff82abbf_34387aed","updated":"2017-11-26 13:56:17.000000000","message":"Oh, I see your point. My bad. Will fix it in next patch.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":1686,"context_line":"                                       chassis_uuid\u003dnode.chassis_uuid)"},{"line_number":1687,"context_line":"        with notify.handle_error_notification(context, new_node, \u0027create\u0027,"},{"line_number":1688,"context_line":"                                              chassis_uuid\u003dnode.chassis_uuid):"},{"line_number":1689,"context_line":""},{"line_number":1690,"context_line":"            new_node \u003d pecan.request.rpcapi.create_node(context,"},{"line_number":1691,"context_line":"                                                        new_node, topic)"},{"line_number":1692,"context_line":"        # Set the HTTP Location Header"}],"source_content_type":"text/x-python","patch_set":67,"id":"ff82abbf_6c86f9bb","line":1689,"updated":"2017-11-28 23:09:45.000000000","message":"not sure why a blank line was added?","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":1686,"context_line":"                                       chassis_uuid\u003dnode.chassis_uuid)"},{"line_number":1687,"context_line":"        with notify.handle_error_notification(context, new_node, \u0027create\u0027,"},{"line_number":1688,"context_line":"                                              chassis_uuid\u003dnode.chassis_uuid):"},{"line_number":1689,"context_line":""},{"line_number":1690,"context_line":"            new_node \u003d pecan.request.rpcapi.create_node(context,"},{"line_number":1691,"context_line":"                                                        new_node, topic)"},{"line_number":1692,"context_line":"        # Set the HTTP Location Header"}],"source_content_type":"text/x-python","patch_set":67,"id":"df87a7cf_c993334f","line":1689,"in_reply_to":"ff82abbf_6c86f9bb","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"2f87fe89550845b9c3c8679bd73a670e1d27f5d6","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                                                configdrive\u003dconfigdrive,"},{"line_number":657,"context_line":"                                                topic\u003dtopic)"},{"line_number":658,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027unrescue\u0027]):"},{"line_number":659,"context_line":"            if pecan.request.rpcapi.can_send_rescue():"},{"line_number":660,"context_line":"                pecan.request.rpcapi.do_node_unrescue("},{"line_number":661,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":662,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]):"}],"source_content_type":"text/x-python","patch_set":73,"id":"bf8cb3f7_85d2ab5b","line":659,"updated":"2017-12-27 04:11:16.000000000","message":"Now that API version is pinned with RPC version, passing the check in L605 means that the RPC is not pinned. This statement can be deleted if it is necessary to reduce the complexity of this method.","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e6e466d9d79372c481d422149d5edbe28a27963c","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                                                configdrive\u003dconfigdrive,"},{"line_number":657,"context_line":"                                                topic\u003dtopic)"},{"line_number":658,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027unrescue\u0027]):"},{"line_number":659,"context_line":"            if pecan.request.rpcapi.can_send_rescue():"},{"line_number":660,"context_line":"                pecan.request.rpcapi.do_node_unrescue("},{"line_number":661,"context_line":"                    pecan.request.context, rpc_node.uuid, topic)"},{"line_number":662,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]):"}],"source_content_type":"text/x-python","patch_set":73,"id":"9f91af0f_f55d57e9","line":659,"in_reply_to":"bf8cb3f7_85d2ab5b","updated":"2018-01-06 14:52:54.000000000","message":"Done","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"2f87fe89550845b9c3c8679bd73a670e1d27f5d6","unresolved":false,"context_lines":[{"line_number":665,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":666,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":667,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":668,"context_line":"            if pecan.request.rpcapi.can_send_rescue():"},{"line_number":669,"context_line":"                pecan.request.rpcapi.do_node_rescue("},{"line_number":670,"context_line":"                    pecan.request.context, rpc_node.uuid,"},{"line_number":671,"context_line":"                    rescue_password, topic)"}],"source_content_type":"text/x-python","patch_set":73,"id":"bf8cb3f7_05c69b9b","line":668,"updated":"2017-12-27 04:11:16.000000000","message":"ditto","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e6e466d9d79372c481d422149d5edbe28a27963c","unresolved":false,"context_lines":[{"line_number":665,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":666,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":667,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":668,"context_line":"            if pecan.request.rpcapi.can_send_rescue():"},{"line_number":669,"context_line":"                pecan.request.rpcapi.do_node_rescue("},{"line_number":670,"context_line":"                    pecan.request.context, rpc_node.uuid,"},{"line_number":671,"context_line":"                    rescue_password, topic)"}],"source_content_type":"text/x-python","patch_set":73,"id":"9f91af0f_95740b6a","line":668,"in_reply_to":"bf8cb3f7_05c69b9b","updated":"2018-01-06 14:52:54.000000000","message":"Done","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":659,"context_line":"            pecan.request.rpcapi.do_node_unrescue("},{"line_number":660,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":661,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]):"},{"line_number":662,"context_line":"            if rescue_password is None:"},{"line_number":663,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":664,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":665,"context_line":"                raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_fed28fff","line":662,"updated":"2018-01-18 21:59:55.000000000","message":"In AgentRescue.validate() you don\u0027t allow empty/blank strings too.","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":659,"context_line":"            pecan.request.rpcapi.do_node_unrescue("},{"line_number":660,"context_line":"                pecan.request.context, rpc_node.uuid, topic)"},{"line_number":661,"context_line":"        elif (target \u003d\u003d ir_states.VERBS[\u0027rescue\u0027]):"},{"line_number":662,"context_line":"            if rescue_password is None:"},{"line_number":663,"context_line":"                msg \u003d (_(\u0027\"rescue_password\" is required when setting target \u0027"},{"line_number":664,"context_line":"                         \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027rescue\u0027])"},{"line_number":665,"context_line":"                raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_28f50484","line":662,"in_reply_to":"7f96bb07_fed28fff","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":871,"context_line":"    storage_interface \u003d wsme.wsattr(wtypes.text)"},{"line_number":872,"context_line":"    \"\"\"The storage interface to be used for this node\"\"\""},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"    rescue_interface \u003d wsme.wsattr(wtypes.text)"},{"line_number":875,"context_line":"    \"\"\"The rescue interface to be used for this node\"\"\""},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    vendor_interface \u003d wsme.wsattr(wtypes.text)"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_5eeb8376","line":874,"updated":"2018-01-18 21:59:55.000000000","message":"nit, to keep it in alpha order, might be good to put this above L871.","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":871,"context_line":"    storage_interface \u003d wsme.wsattr(wtypes.text)"},{"line_number":872,"context_line":"    \"\"\"The storage interface to be used for this node\"\"\""},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"    rescue_interface \u003d wsme.wsattr(wtypes.text)"},{"line_number":875,"context_line":"    \"\"\"The rescue interface to be used for this node\"\"\""},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    vendor_interface \u003d wsme.wsattr(wtypes.text)"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_052351c0","line":874,"in_reply_to":"7f96bb07_5eeb8376","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"1ab3aeeb5d0bba9462be3d084f15b34ee111abc4","unresolved":false,"context_lines":[{"line_number":1652,"context_line":""},{"line_number":1653,"context_line":"        if (not api_utils.allow_rescue_interface() and"},{"line_number":1654,"context_line":"                node.rescue_interface is not wtypes.Unset):"},{"line_number":1655,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        # NOTE(deva): get_topic_for checks if node.driver is in the hash ring"},{"line_number":1658,"context_line":"        #             and raises NoValidHost if it is not."}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_1e6749b9","line":1655,"range":{"start_line":1655,"start_character":12,"end_line":1655,"end_character":16},"updated":"2018-01-18 15:01:59.000000000","message":"nit: over indented?","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":1652,"context_line":""},{"line_number":1653,"context_line":"        if (not api_utils.allow_rescue_interface() and"},{"line_number":1654,"context_line":"                node.rescue_interface is not wtypes.Unset):"},{"line_number":1655,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        # NOTE(deva): get_topic_for checks if node.driver is in the hash ring"},{"line_number":1658,"context_line":"        #             and raises NoValidHost if it is not."}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_c52c89ae","line":1655,"range":{"start_line":1655,"start_character":12,"end_line":1655,"end_character":16},"in_reply_to":"7f96bb07_1e6749b9","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"1ab3aeeb5d0bba9462be3d084f15b34ee111abc4","unresolved":false,"context_lines":[{"line_number":1727,"context_line":""},{"line_number":1728,"context_line":"        r_interface \u003d api_utils.get_patch_values(patch, \u0027/rescue_interface\u0027)"},{"line_number":1729,"context_line":"        if r_interface and not api_utils.allow_rescue_interface():"},{"line_number":1730,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1731,"context_line":""},{"line_number":1732,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":1733,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_3efb25c1","line":1730,"range":{"start_line":1730,"start_character":11,"end_line":1730,"end_character":16},"updated":"2018-01-18 15:01:59.000000000","message":"nit: over indented?","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":1727,"context_line":""},{"line_number":1728,"context_line":"        r_interface \u003d api_utils.get_patch_values(patch, \u0027/rescue_interface\u0027)"},{"line_number":1729,"context_line":"        if r_interface and not api_utils.allow_rescue_interface():"},{"line_number":1730,"context_line":"                raise exception.NotAcceptable()"},{"line_number":1731,"context_line":""},{"line_number":1732,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":1733,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_e529859b","line":1730,"range":{"start_line":1730,"start_character":11,"end_line":1730,"end_character":16},"in_reply_to":"7f96bb07_3efb25c1","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"}],"ironic/api/controllers/v1/ramdisk.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                         \u0027driver_internal_info\u0027)"},{"line_number":39,"context_line":"_LOOKUP_ALLOWED_STATES \u003d {states.DEPLOYING, states.DEPLOYWAIT,"},{"line_number":40,"context_line":"                          states.CLEANING, states.CLEANWAIT,"},{"line_number":41,"context_line":"                          states.INSPECTING, states.RESCUEWAIT}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def config():"}],"source_content_type":"text/x-python","patch_set":67,"id":"ff82abbf_0c7f2dab","line":41,"updated":"2017-11-28 23:09:45.000000000","message":"why do we have CLEANING, DEPLOYING \u0026 INSPECTING, but no RESCUING? I\u0027m guessing it is due to a timing issue between conductor and agent that the *ING states are here, but not sure. Comments would have been nice...","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                         \u0027driver_internal_info\u0027)"},{"line_number":39,"context_line":"_LOOKUP_ALLOWED_STATES \u003d {states.DEPLOYING, states.DEPLOYWAIT,"},{"line_number":40,"context_line":"                          states.CLEANING, states.CLEANWAIT,"},{"line_number":41,"context_line":"                          states.INSPECTING, states.RESCUEWAIT}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def config():"}],"source_content_type":"text/x-python","patch_set":67,"id":"df87a7cf_29a2df9b","line":41,"in_reply_to":"ff82abbf_0c7f2dab","updated":"2017-12-03 16:39:51.000000000","message":"I dont have any string reasons for RESCUING not to be here. Adding it.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":39,"context_line":"_LOOKUP_ALLOWED_STATES \u003d {states.DEPLOYING, states.DEPLOYWAIT,"},{"line_number":40,"context_line":"                          states.CLEANING, states.CLEANWAIT,"},{"line_number":41,"context_line":"                          states.INSPECTING, states.RESCUING,"},{"line_number":42,"context_line":"                          states.RESCUEWAIT}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def config():"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_e1150e3e","line":42,"updated":"2018-01-18 21:59:55.000000000","message":"nit, the way the other ones are formatted, I\u0027d think we\u0027d want to put RESCUING \u0026 RESCUEWAIT on the same line.","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"_LOOKUP_ALLOWED_STATES \u003d {states.DEPLOYING, states.DEPLOYWAIT,"},{"line_number":40,"context_line":"                          states.CLEANING, states.CLEANWAIT,"},{"line_number":41,"context_line":"                          states.INSPECTING, states.RESCUING,"},{"line_number":42,"context_line":"                          states.RESCUEWAIT}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def config():"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_32a9f88f","line":42,"in_reply_to":"7f96bb07_e1150e3e","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"261d1a33a3cef904b9b859310bba98a859a482a0","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    if \u0027resource_class\u0027 in fields and not allow_resource_class():"},{"line_number":303,"context_line":"        raise exception.NotAcceptable()"},{"line_number":304,"context_line":"    if not allow_dynamic_interfaces():"},{"line_number":305,"context_line":"        if set(V31_FIELDS).intersection(set(fields)):"},{"line_number":306,"context_line":"            raise exception.NotAcceptable()"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_8071ab46","line":305,"updated":"2017-03-21 22:23:06.000000000","message":"shouldn\u0027t this method be updated for v32 fields?\nOtherwise no exception will be raised when:\n* requesting rescue interface field with get one when version \u003c32.\n* requesting get list filetered by rescue interface when version \u003c32\n\nSince unit tests pass, probably unit tests for these cases should be added.","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"b3dca29a8921bcd82a05dc06badde00cb8005530","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    if \u0027resource_class\u0027 in fields and not allow_resource_class():"},{"line_number":303,"context_line":"        raise exception.NotAcceptable()"},{"line_number":304,"context_line":"    if not allow_dynamic_interfaces():"},{"line_number":305,"context_line":"        if set(V31_FIELDS).intersection(set(fields)):"},{"line_number":306,"context_line":"            raise exception.NotAcceptable()"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_b99b3e17","line":305,"in_reply_to":"1a1ced50_8071ab46","updated":"2017-03-22 00:05:14.000000000","message":"+1 And maybe an additional test is also missing (not sure)\n\nif not allow_rescue():\n    # check V32_FIELDS","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8e234d4f9e3089f1fa3727cc00e16d7063980a16","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    if \u0027resource_class\u0027 in fields and not allow_resource_class():"},{"line_number":303,"context_line":"        raise exception.NotAcceptable()"},{"line_number":304,"context_line":"    if not allow_dynamic_interfaces():"},{"line_number":305,"context_line":"        if set(V31_FIELDS).intersection(set(fields)):"},{"line_number":306,"context_line":"            raise exception.NotAcceptable()"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_0e8dc6d5","line":305,"in_reply_to":"1a1ced50_b99b3e17","updated":"2017-03-22 17:57:07.000000000","message":"Done, and added test (ironic.tests.unit.api.v1.test_utils.TestApiUtils.test_check_allowed_fields_rescue_interface_fail)","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"261d1a33a3cef904b9b859310bba98a859a482a0","unresolved":false,"context_lines":[{"line_number":559,"context_line":"    Version 1.32 of the API added support for rescue and unrescue."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    return (pecan.request.version.minor \u003e\u003d"},{"line_number":562,"context_line":"            versions.MINOR_32_RESCUE)"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"def get_controller_reserved_names(cls):"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_03122509","line":562,"updated":"2017-03-21 22:23:06.000000000","message":"nit: why a two-liner?","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8e234d4f9e3089f1fa3727cc00e16d7063980a16","unresolved":false,"context_lines":[{"line_number":559,"context_line":"    Version 1.32 of the API added support for rescue and unrescue."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    return (pecan.request.version.minor \u003e\u003d"},{"line_number":562,"context_line":"            versions.MINOR_32_RESCUE)"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"def get_controller_reserved_names(cls):"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_89bff05f","line":562,"in_reply_to":"1a1ced50_03122509","updated":"2017-03-22 17:57:07.000000000","message":"Done","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ecfbf97b5c89dd20e3c0517ae4d03047a9f7f87a","unresolved":false,"context_lines":[{"line_number":66,"context_line":"]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"V32_FIELDS \u003d ["},{"line_number":69,"context_line":"    \u0027rescue_interface\u0027,"},{"line_number":70,"context_line":"]"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"bff0334d_f0d97a82","line":69,"range":{"start_line":69,"start_character":5,"end_line":69,"end_character":21},"updated":"2017-04-12 17:26:38.000000000","message":"not sure you need the list in this case, why not just one value? does not matter much tho","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bbda48af85f136be9004a041c8d4013cb36ba3ee","unresolved":false,"context_lines":[{"line_number":66,"context_line":"]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"V32_FIELDS \u003d ["},{"line_number":69,"context_line":"    \u0027rescue_interface\u0027,"},{"line_number":70,"context_line":"]"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1f013ff3_4bcb711d","line":69,"range":{"start_line":69,"start_character":5,"end_line":69,"end_character":21},"in_reply_to":"bff0334d_f0d97a82","updated":"2017-05-17 11:02:34.000000000","message":"Done","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"70024ca3782b11bf402b7876cbaee0be52898966","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    states.VERBS[\u0027abort\u0027]: versions.MINOR_13_ABORT_VERB,"},{"line_number":53,"context_line":"    states.VERBS[\u0027clean\u0027]: versions.MINOR_15_MANUAL_CLEAN,"},{"line_number":54,"context_line":"    states.VERBS[\u0027adopt\u0027]: versions.MINOR_17_ADOPT_VERB,"},{"line_number":55,"context_line":"    states.VERBS[\u0027rescue\u0027]: versions.MINOR_36_RESCUE_INTERFACE,"},{"line_number":56,"context_line":"}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"V31_FIELDS \u003d ["}],"source_content_type":"text/x-python","patch_set":65,"id":"1f485f77_2dc15e2f","line":55,"updated":"2017-11-15 08:45:30.000000000","message":"\u0027unrescue\u0027 is missing.","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5c5b7de06b7cd9afc0e0f6db88e0e9f66bbf20d8","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    states.VERBS[\u0027abort\u0027]: versions.MINOR_13_ABORT_VERB,"},{"line_number":53,"context_line":"    states.VERBS[\u0027clean\u0027]: versions.MINOR_15_MANUAL_CLEAN,"},{"line_number":54,"context_line":"    states.VERBS[\u0027adopt\u0027]: versions.MINOR_17_ADOPT_VERB,"},{"line_number":55,"context_line":"    states.VERBS[\u0027rescue\u0027]: versions.MINOR_36_RESCUE_INTERFACE,"},{"line_number":56,"context_line":"}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"V31_FIELDS \u003d ["}],"source_content_type":"text/x-python","patch_set":65,"id":"1f485f77_9737f9ff","line":55,"in_reply_to":"1f485f77_2dc15e2f","updated":"2017-11-24 14:57:52.000000000","message":"Done","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"2f87fe89550845b9c3c8679bd73a670e1d27f5d6","unresolved":false,"context_lines":[{"line_number":619,"context_line":"def allow_rescue_interface():"},{"line_number":620,"context_line":"    \"\"\"Check if we should support rescue and unrescue operations and interface."},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    Version 1.36 of the API added support for rescue and unrescue."},{"line_number":623,"context_line":"    \"\"\""},{"line_number":624,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_37_RESCUE_INTERFACE"},{"line_number":625,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"bf8cb3f7_eac4a661","line":622,"range":{"start_line":622,"start_character":11,"end_line":622,"end_character":16},"updated":"2017-12-27 04:11:16.000000000","message":"nit: s/1.36/1.37/","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e6e466d9d79372c481d422149d5edbe28a27963c","unresolved":false,"context_lines":[{"line_number":619,"context_line":"def allow_rescue_interface():"},{"line_number":620,"context_line":"    \"\"\"Check if we should support rescue and unrescue operations and interface."},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    Version 1.36 of the API added support for rescue and unrescue."},{"line_number":623,"context_line":"    \"\"\""},{"line_number":624,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_37_RESCUE_INTERFACE"},{"line_number":625,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"9f91af0f_3c996c1e","line":622,"range":{"start_line":622,"start_character":11,"end_line":622,"end_character":16},"in_reply_to":"bf8cb3f7_eac4a661","updated":"2018-01-06 14:52:54.000000000","message":"Done","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    states.VERBS[\u0027abort\u0027]: versions.MINOR_13_ABORT_VERB,"},{"line_number":53,"context_line":"    states.VERBS[\u0027clean\u0027]: versions.MINOR_15_MANUAL_CLEAN,"},{"line_number":54,"context_line":"    states.VERBS[\u0027adopt\u0027]: versions.MINOR_17_ADOPT_VERB,"},{"line_number":55,"context_line":"    states.VERBS[\u0027rescue\u0027]: versions.MINOR_37_RESCUE_INTERFACE,"},{"line_number":56,"context_line":"    states.VERBS[\u0027unrescue\u0027]: versions.MINOR_37_RESCUE_INTERFACE,"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"V31_FIELDS \u003d ["}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_54c26487","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":65},"updated":"2018-01-25 03:29:53.000000000","message":"s/37/38/","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    states.VERBS[\u0027abort\u0027]: versions.MINOR_13_ABORT_VERB,"},{"line_number":53,"context_line":"    states.VERBS[\u0027clean\u0027]: versions.MINOR_15_MANUAL_CLEAN,"},{"line_number":54,"context_line":"    states.VERBS[\u0027adopt\u0027]: versions.MINOR_17_ADOPT_VERB,"},{"line_number":55,"context_line":"    states.VERBS[\u0027rescue\u0027]: versions.MINOR_37_RESCUE_INTERFACE,"},{"line_number":56,"context_line":"    states.VERBS[\u0027unrescue\u0027]: versions.MINOR_37_RESCUE_INTERFACE,"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"V31_FIELDS \u003d ["}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_fa183776","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":65},"in_reply_to":"5f93b717_54c26487","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":619,"context_line":"def allow_rescue_interface():"},{"line_number":620,"context_line":"    \"\"\"Check if we should support rescue and unrescue operations and interface."},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    Version 1.37 of the API added support for rescue and unrescue."},{"line_number":623,"context_line":"    \"\"\""},{"line_number":624,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_37_RESCUE_INTERFACE"},{"line_number":625,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_b43648b4","line":622,"range":{"start_line":622,"start_character":14,"end_line":622,"end_character":16},"updated":"2018-01-25 03:29:53.000000000","message":"s/37/38","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":619,"context_line":"def allow_rescue_interface():"},{"line_number":620,"context_line":"    \"\"\"Check if we should support rescue and unrescue operations and interface."},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    Version 1.37 of the API added support for rescue and unrescue."},{"line_number":623,"context_line":"    \"\"\""},{"line_number":624,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_37_RESCUE_INTERFACE"},{"line_number":625,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_baa5cfb7","line":622,"range":{"start_line":622,"start_character":14,"end_line":622,"end_character":16},"in_reply_to":"5f93b717_b43648b4","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    Version 1.37 of the API added support for rescue and unrescue."},{"line_number":623,"context_line":"    \"\"\""},{"line_number":624,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_37_RESCUE_INTERFACE"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"def get_controller_reserved_names(cls):"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_14bcdc03","line":624,"range":{"start_line":624,"start_character":57,"end_line":624,"end_character":59},"updated":"2018-01-25 03:29:53.000000000","message":"s/37/38/","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    Version 1.37 of the API added support for rescue and unrescue."},{"line_number":623,"context_line":"    \"\"\""},{"line_number":624,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_37_RESCUE_INTERFACE"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"def get_controller_reserved_names(cls):"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_5aaa8b85","line":624,"range":{"start_line":624,"start_character":57,"end_line":624,"end_character":59},"in_reply_to":"5f93b717_14bcdc03","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"}],"ironic/api/controllers/v1/versions.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"b2737db409a5a1e1862d2958c3cc0261e31c322f","unresolved":false,"context_lines":[{"line_number":58,"context_line":"# v1.25: Add possibility to unset chassis_uuid from node."},{"line_number":59,"context_line":"# v1.26: Add portgroup.mode and portgroup.properties."},{"line_number":60,"context_line":"# v1.27: Add soft reboot, soft power off and timeout."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":63,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"},{"line_number":64,"context_line":"MINOR_2_AVAILABLE_STATE \u003d 2"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba5201f7_55353af5","line":61,"updated":"2017-01-09 22:49:15.000000000","message":"can you add a comment here for v1.28?","commit_id":"b4d8cbc4aa0bfff1f7a94e7f8154aedf82d8f9da"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"32cc4ba5ccc137a15edb3167456536976856a05b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"# v1.25: Add possibility to unset chassis_uuid from node."},{"line_number":59,"context_line":"# v1.26: Add portgroup.mode and portgroup.properties."},{"line_number":60,"context_line":"# v1.27: Add soft reboot, soft power off and timeout."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":63,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"},{"line_number":64,"context_line":"MINOR_2_AVAILABLE_STATE \u003d 2"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba5201f7_e5010b3b","line":61,"in_reply_to":"ba5201f7_55353af5","updated":"2017-01-10 10:26:56.000000000","message":"++","commit_id":"b4d8cbc4aa0bfff1f7a94e7f8154aedf82d8f9da"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"221c53a8042c00f7de1752dac094200edf26aa55","unresolved":false,"context_lines":[{"line_number":58,"context_line":"# v1.25: Add possibility to unset chassis_uuid from node."},{"line_number":59,"context_line":"# v1.26: Add portgroup.mode and portgroup.properties."},{"line_number":60,"context_line":"# v1.27: Add soft reboot, soft power off and timeout."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":63,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"},{"line_number":64,"context_line":"MINOR_2_AVAILABLE_STATE \u003d 2"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba5201f7_173b96ec","line":61,"in_reply_to":"ba5201f7_e5010b3b","updated":"2017-01-10 14:32:13.000000000","message":"Done","commit_id":"b4d8cbc4aa0bfff1f7a94e7f8154aedf82d8f9da"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# v1.26: Add portgroup.mode and portgroup.properties."},{"line_number":60,"context_line":"# v1.27: Add soft reboot, soft power off and timeout."},{"line_number":61,"context_line":"# v1.28: Add vifs subcontroller to node"},{"line_number":62,"context_line":"# v1.29: Add rescue, unrescue, and rescue_password."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":65,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_0b52a267","line":62,"updated":"2017-01-19 21:52:22.000000000","message":"This comment could be clearer - e.g. \nAdd rescue and unrescue provision states \n(rescue_password definitely does not fit in here)","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# v1.26: Add portgroup.mode and portgroup.properties."},{"line_number":60,"context_line":"# v1.27: Add soft reboot, soft power off and timeout."},{"line_number":61,"context_line":"# v1.28: Add vifs subcontroller to node"},{"line_number":62,"context_line":"# v1.29: Add rescue, unrescue, and rescue_password."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":65,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_1531b305","line":62,"in_reply_to":"5a3905b3_0b52a267","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"243fcd8a08742092a07498236f941b5553c38ed0","unresolved":false,"context_lines":[{"line_number":65,"context_line":"# v1.32: Add volume support."},{"line_number":66,"context_line":"# v1.33: Add node storage interface"},{"line_number":67,"context_line":"# v1.34: Add physical network field to port."},{"line_number":68,"context_line":"# v1.35: Add rescue and unrescue provision states"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":71,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_7c277db8","line":68,"updated":"2017-09-21 03:45:21.000000000","message":"nit: This patch also adds rescue_interface to the node object. Worth mentioning here as well.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e22de292978bc29bb4ea87d9c45bef76c839b296","unresolved":false,"context_lines":[{"line_number":65,"context_line":"# v1.32: Add volume support."},{"line_number":66,"context_line":"# v1.33: Add node storage interface"},{"line_number":67,"context_line":"# v1.34: Add physical network field to port."},{"line_number":68,"context_line":"# v1.35: Add rescue and unrescue provision states"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":71,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_d0aacd17","line":68,"in_reply_to":"9f5c4f37_7c277db8","updated":"2017-09-21 05:38:31.000000000","message":"Done","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":113,"context_line":"MINOR_34_PORT_PHYSICAL_NETWORK \u003d 34"},{"line_number":114,"context_line":"MINOR_35_REBUILD_CONFIG_DRIVE \u003d 35"},{"line_number":115,"context_line":"MINOR_36_AGENT_VERSION_HEARTBEAT \u003d 36"},{"line_number":116,"context_line":"MINOR_37_RESCUE_INTERFACE \u003d 37"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"# When adding another version, update:"},{"line_number":119,"context_line":"# - MINOR_MAX_VERSION"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_b483a856","line":116,"updated":"2018-01-25 03:29:53.000000000","message":"https://review.openstack.org/#/c/532269/ is on track to merge, so this will need to be updated to 38","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":113,"context_line":"MINOR_34_PORT_PHYSICAL_NETWORK \u003d 34"},{"line_number":114,"context_line":"MINOR_35_REBUILD_CONFIG_DRIVE \u003d 35"},{"line_number":115,"context_line":"MINOR_36_AGENT_VERSION_HEARTBEAT \u003d 36"},{"line_number":116,"context_line":"MINOR_37_RESCUE_INTERFACE \u003d 37"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"# When adding another version, update:"},{"line_number":119,"context_line":"# - MINOR_MAX_VERSION"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_7a2667ba","line":116,"in_reply_to":"5f93b717_b483a856","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":121,"context_line":"#   explanation of what changed in the new version"},{"line_number":122,"context_line":"# - common/release_mappings.py, RELEASE_MAPPING[\u0027master\u0027][\u0027api\u0027]"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"MINOR_MAX_VERSION \u003d MINOR_37_RESCUE_INTERFACE"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"# String representations of the minor and maximum versions"},{"line_number":127,"context_line":"_MIN_VERSION_STRING \u003d \u0027{}.{}\u0027.format(BASE_VERSION, MINOR_1_INITIAL_VERSION)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_34979893","line":124,"updated":"2018-01-25 03:29:53.000000000","message":"This as well, s/37/38/","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":121,"context_line":"#   explanation of what changed in the new version"},{"line_number":122,"context_line":"# - common/release_mappings.py, RELEASE_MAPPING[\u0027master\u0027][\u0027api\u0027]"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"MINOR_MAX_VERSION \u003d MINOR_37_RESCUE_INTERFACE"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"# String representations of the minor and maximum versions"},{"line_number":127,"context_line":"_MIN_VERSION_STRING \u003d \u0027{}.{}\u0027.format(BASE_VERSION, MINOR_1_INITIAL_VERSION)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_1a3ba3d1","line":124,"in_reply_to":"5f93b717_34979893","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"}],"ironic/common/exception.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"class InstanceRescueFailure(IronicException):"},{"line_number":204,"context_line":"    message \u003d _(\"Failed to rescue instance: %(reason)s\")"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"class InstanceUnRescueFailure(IronicException):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_42fd5839","line":204,"updated":"2016-11-15 18:34:14.000000000","message":"Should instance or node UUID have its own parameter here and below?","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    message \u003d _(\"Failed to rescue instance for node %(node)s: %(reason)s\")"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"class InstanceUnRescueFailure(IronicException):"},{"line_number":292,"context_line":"    message \u003d _(\"Failed to unrescue instance for node %(node)s: %(reason)s\")"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_abe8ae7d","line":291,"updated":"2017-01-19 21:52:22.000000000","message":"not sure, but:\nUnRescue/Unrescue\n?","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    message \u003d _(\"Failed to rescue instance for node %(node)s: %(reason)s\")"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"class InstanceUnRescueFailure(IronicException):"},{"line_number":292,"context_line":"    message \u003d _(\"Failed to unrescue instance for node %(node)s: %(reason)s\")"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_e847ea1a","line":291,"in_reply_to":"5a3905b3_abe8ae7d","updated":"2017-01-20 18:15:26.000000000","message":"I think it\u0027s fine either way. I changed it because I don\u0027t have a strong opinion.","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"99bd24f97eaf91a8459a4459ba10200e6dc98d0f","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"class InstanceRescueFailure(IronicException):"},{"line_number":288,"context_line":"    message \u003d _(\"Failed to rescue instance for node %(node)s: %(reason)s\")"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"class InstanceUnrescueFailure(IronicException):"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_63d22fd4","line":288,"range":{"start_line":288,"start_character":4,"end_line":288,"end_character":11},"updated":"2017-01-20 22:16:40.000000000","message":"I think this need to be _msg_fmt.","commit_id":"b31cf228de776fedb34b5069bd7b0782095143b6"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"511722d9da345fa2b7801f3593bd60e5a2c9ce23","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"class InstanceRescueFailure(IronicException):"},{"line_number":288,"context_line":"    message \u003d _(\"Failed to rescue instance for node %(node)s: %(reason)s\")"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"class InstanceUnrescueFailure(IronicException):"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_ec2c0c04","line":288,"range":{"start_line":288,"start_character":4,"end_line":288,"end_character":11},"in_reply_to":"5a3905b3_63d22fd4","updated":"2017-01-23 15:45:08.000000000","message":"Good catch! Done.","commit_id":"b31cf228de776fedb34b5069bd7b0782095143b6"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"99bd24f97eaf91a8459a4459ba10200e6dc98d0f","unresolved":false,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"class InstanceUnrescueFailure(IronicException):"},{"line_number":292,"context_line":"    message \u003d _(\"Failed to unrescue instance for node %(node)s: %(reason)s\")"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"class ImageUnacceptable(IronicException):"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_c3d763bd","line":292,"range":{"start_line":292,"start_character":4,"end_line":292,"end_character":11},"updated":"2017-01-20 22:16:40.000000000","message":"I think this need to be _msg_fmt.","commit_id":"b31cf228de776fedb34b5069bd7b0782095143b6"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"511722d9da345fa2b7801f3593bd60e5a2c9ce23","unresolved":false,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"class InstanceUnrescueFailure(IronicException):"},{"line_number":292,"context_line":"    message \u003d _(\"Failed to unrescue instance for node %(node)s: %(reason)s\")"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"class ImageUnacceptable(IronicException):"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_6c41fca8","line":292,"range":{"start_line":292,"start_character":4,"end_line":292,"end_character":11},"in_reply_to":"5a3905b3_c3d763bd","updated":"2017-01-23 15:45:08.000000000","message":"Done","commit_id":"b31cf228de776fedb34b5069bd7b0782095143b6"}],"ironic/common/release_mappings.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        }"},{"line_number":122,"context_line":"    },"},{"line_number":123,"context_line":"    \u0027master\u0027: {"},{"line_number":124,"context_line":"        \u0027api\u0027: \u00271.37\u0027,"},{"line_number":125,"context_line":"        \u0027rpc\u0027: \u00271.43\u0027,"},{"line_number":126,"context_line":"        \u0027objects\u0027: {"},{"line_number":127,"context_line":"            \u0027Node\u0027: [\u00271.22\u0027],"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_94d0ec52","line":124,"updated":"2018-01-25 03:29:53.000000000","message":"s/37/38/","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        }"},{"line_number":122,"context_line":"    },"},{"line_number":123,"context_line":"    \u0027master\u0027: {"},{"line_number":124,"context_line":"        \u0027api\u0027: \u00271.37\u0027,"},{"line_number":125,"context_line":"        \u0027rpc\u0027: \u00271.43\u0027,"},{"line_number":126,"context_line":"        \u0027objects\u0027: {"},{"line_number":127,"context_line":"            \u0027Node\u0027: [\u00271.22\u0027],"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_3f0a1126","line":124,"in_reply_to":"5f93b717_94d0ec52","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"}],"ironic/common/states.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":166,"context_line":"This is the provision state used when inspection is started. A successfully"},{"line_number":167,"context_line":"inspected node shall transition to MANAGEABLE state."},{"line_number":168,"context_line":"\"\"\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"INSPECTFAIL \u003d \u0027inspect failed\u0027"},{"line_number":171,"context_line":"\"\"\" Node inspection failed. \"\"\""},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_e2a4a458","line":169,"updated":"2016-11-15 18:34:14.000000000","message":"nit: this line removal is unrelated","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":166,"context_line":"This is the provision state used when inspection is started. A successfully"},{"line_number":167,"context_line":"inspected node shall transition to MANAGEABLE state."},{"line_number":168,"context_line":"\"\"\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"INSPECTFAIL \u003d \u0027inspect failed\u0027"},{"line_number":171,"context_line":"\"\"\" Node inspection failed. \"\"\""},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_6dc9c0ab","line":169,"in_reply_to":"7a77a97e_e2a4a458","updated":"2016-11-18 22:51:31.000000000","message":"bah, you caught me. fixed.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":193,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":196,"context_line":"\"\"\" Node is waiting to be rescued."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"This will be the node `provision_state` while the node is waiting for"},{"line_number":199,"context_line":"the driver to finish rescue."}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_2223fcbe","line":196,"updated":"2016-11-15 18:34:14.000000000","message":"This means that we\u0027re waiting on an external callback, more specifically. See the spec: https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/implement-rescue-mode.html#state-machine-impact","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":193,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":196,"context_line":"\"\"\" Node is waiting to be rescued."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"This will be the node `provision_state` while the node is waiting for"},{"line_number":199,"context_line":"the driver to finish rescue."}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_adc75894","line":196,"in_reply_to":"7a77a97e_2223fcbe","updated":"2016-11-18 22:51:31.000000000","message":"Done","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":208,"context_line":"UNRESCUING \u003d \u0027unrescuing\u0027"},{"line_number":209,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# TODO(jcook): ensure that RESCUEWAIT should go to RESCUING not RESCUE"},{"line_number":212,"context_line":"VALID_RESCUE_STATES \u003d (ACTIVE, RESCUE, RESCUEFAIL, RESCUEWAIT, UNRESCUEFAIL)"},{"line_number":213,"context_line":"\"\"\" States rescue operation is allowed from. \"\"\""},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_1d490532","line":211,"updated":"2016-11-15 18:34:14.000000000","message":"I think this is already done. See L404.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":208,"context_line":"UNRESCUING \u003d \u0027unrescuing\u0027"},{"line_number":209,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# TODO(jcook): ensure that RESCUEWAIT should go to RESCUING not RESCUE"},{"line_number":212,"context_line":"VALID_RESCUE_STATES \u003d (ACTIVE, RESCUE, RESCUEFAIL, RESCUEWAIT, UNRESCUEFAIL)"},{"line_number":213,"context_line":"\"\"\" States rescue operation is allowed from. \"\"\""},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_2d6188a9","line":211,"in_reply_to":"7a77a97e_1d490532","updated":"2016-11-18 22:51:31.000000000","message":"Yeah. This comment was to verify that this is the correct behavior. Consensus between Mario, Jay, and Jesse was that yes, this is right behavior. Removed TODO.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"349c0cbbe98a87c5643f544a084948ffcd0c2889","unresolved":false,"context_lines":[{"line_number":208,"context_line":"UNRESCUING \u003d \u0027unrescuing\u0027"},{"line_number":209,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# TODO(jcook): ensure that RESCUEWAIT should go to RESCUING not RESCUE"},{"line_number":212,"context_line":"VALID_RESCUE_STATES \u003d (ACTIVE, RESCUE, RESCUEFAIL, RESCUEWAIT, UNRESCUEFAIL)"},{"line_number":213,"context_line":"\"\"\" States rescue operation is allowed from. \"\"\""},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_eb5e6011","line":211,"in_reply_to":"7a77a97e_2d6188a9","updated":"2016-11-21 16:09:18.000000000","message":"Thanks","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":209,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# TODO(jcook): ensure that RESCUEWAIT should go to RESCUING not RESCUE"},{"line_number":212,"context_line":"VALID_RESCUE_STATES \u003d (ACTIVE, RESCUE, RESCUEFAIL, RESCUEWAIT, UNRESCUEFAIL)"},{"line_number":213,"context_line":"\"\"\" States rescue operation is allowed from. \"\"\""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"VALID_UNRESCUE_STATES \u003d (RESCUE, RESCUEFAIL, UNRESCUEFAIL)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_225cdc4a","line":212,"updated":"2016-11-15 18:34:14.000000000","message":"Why isn\u0027t RESCUING a valid rescue state? It should be a no-op but allowed IMO.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":209,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# TODO(jcook): ensure that RESCUEWAIT should go to RESCUING not RESCUE"},{"line_number":212,"context_line":"VALID_RESCUE_STATES \u003d (ACTIVE, RESCUE, RESCUEFAIL, RESCUEWAIT, UNRESCUEFAIL)"},{"line_number":213,"context_line":"\"\"\" States rescue operation is allowed from. \"\"\""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"VALID_UNRESCUE_STATES \u003d (RESCUE, RESCUEFAIL, UNRESCUEFAIL)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_6d81c0fa","line":212,"in_reply_to":"7a77a97e_225cdc4a","updated":"2016-11-18 22:51:31.000000000","message":"Should not be able to rescue while in a transitional state. Which means we should also probably also remove RESCUEWAIT (not currently in the spec). Good question.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":222,"context_line":"DELETE_ALLOWED_STATES \u003d (AVAILABLE, MANAGEABLE, ENROLL, ADOPTFAIL)"},{"line_number":223,"context_line":"\"\"\"States in which node deletion is allowed.\"\"\""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"},{"line_number":226,"context_line":"\"\"\"States that will not transition unless receiving a request.\"\"\""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_fd3a89cc","line":225,"range":{"start_line":225,"start_character":56,"end_line":225,"end_character":61},"updated":"2016-11-15 18:34:14.000000000","message":"Will ERROR cover RESCUEFAIL and UNRESCUEFAIL states? I don\u0027t see other failure states here, so I\u0027m assuming so but wondering if something extra needs to happen for that.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"349c0cbbe98a87c5643f544a084948ffcd0c2889","unresolved":false,"context_lines":[{"line_number":222,"context_line":"DELETE_ALLOWED_STATES \u003d (AVAILABLE, MANAGEABLE, ENROLL, ADOPTFAIL)"},{"line_number":223,"context_line":"\"\"\"States in which node deletion is allowed.\"\"\""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"},{"line_number":226,"context_line":"\"\"\"States that will not transition unless receiving a request.\"\"\""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_99054916","line":225,"range":{"start_line":225,"start_character":56,"end_line":225,"end_character":61},"in_reply_to":"7a77a97e_68252e5a","updated":"2016-11-21 16:09:18.000000000","message":"You\u0027re right, +1. I got confused because https://review.openstack.org/#/c/385459/2/ironic/common/states.py which redefines stable states hasn\u0027t landed yet. ERROR will no longer be in here after that patch, but RESCUE should remain here after that lands.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":222,"context_line":"DELETE_ALLOWED_STATES \u003d (AVAILABLE, MANAGEABLE, ENROLL, ADOPTFAIL)"},{"line_number":223,"context_line":"\"\"\"States in which node deletion is allowed.\"\"\""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"},{"line_number":226,"context_line":"\"\"\"States that will not transition unless receiving a request.\"\"\""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_68252e5a","line":225,"range":{"start_line":225,"start_character":56,"end_line":225,"end_character":61},"in_reply_to":"7a77a97e_fd3a89cc","updated":"2016-11-18 22:51:31.000000000","message":"Can\u0027t request [UN]RESCUEFAIL, so not stable?","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":293,"context_line":"machine.add_state(ADOPTING, target\u003dACTIVE, **watchers)"},{"line_number":294,"context_line":"machine.add_state(ADOPTFAIL, target\u003dACTIVE, **watchers)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"# rescue states"},{"line_number":297,"context_line":"machine.add_state(RESCUING, target\u003dRESCUE, **watchers)"},{"line_number":298,"context_line":"machine.add_state(RESCUEWAIT, target\u003dRESCUE, **watchers)"},{"line_number":299,"context_line":"machine.add_state(RESCUEFAIL, target\u003dRESCUE, **watchers)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_dd5ced27","line":296,"updated":"2016-11-15 18:34:14.000000000","message":"The RESCUE state itself was not added here. It\u0027s both a verb and a state.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"349c0cbbe98a87c5643f544a084948ffcd0c2889","unresolved":false,"context_lines":[{"line_number":293,"context_line":"machine.add_state(ADOPTING, target\u003dACTIVE, **watchers)"},{"line_number":294,"context_line":"machine.add_state(ADOPTFAIL, target\u003dACTIVE, **watchers)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"# rescue states"},{"line_number":297,"context_line":"machine.add_state(RESCUING, target\u003dRESCUE, **watchers)"},{"line_number":298,"context_line":"machine.add_state(RESCUEWAIT, target\u003dRESCUE, **watchers)"},{"line_number":299,"context_line":"machine.add_state(RESCUEFAIL, target\u003dRESCUE, **watchers)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_0b739cb5","line":296,"in_reply_to":"7a77a97e_6daf007d","updated":"2016-11-21 16:09:18.000000000","message":"You\u0027re right, thanks","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":293,"context_line":"machine.add_state(ADOPTING, target\u003dACTIVE, **watchers)"},{"line_number":294,"context_line":"machine.add_state(ADOPTFAIL, target\u003dACTIVE, **watchers)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"# rescue states"},{"line_number":297,"context_line":"machine.add_state(RESCUING, target\u003dRESCUE, **watchers)"},{"line_number":298,"context_line":"machine.add_state(RESCUEWAIT, target\u003dRESCUE, **watchers)"},{"line_number":299,"context_line":"machine.add_state(RESCUEFAIL, target\u003dRESCUE, **watchers)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_6daf007d","line":296,"in_reply_to":"7a77a97e_dd5ced27","updated":"2016-11-18 22:51:31.000000000","message":"It\u0027s added in the stable states loop.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":401,"context_line":"# A rescue may succeed."},{"line_number":402,"context_line":"machine.add_transition(RESCUING, RESCUE, \u0027done\u0027)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"# TODO(jcook): Ensure RESCUEWAIT goes to RESCUING not RESCUE"},{"line_number":405,"context_line":"# A rescue may also wait on external callbacks"},{"line_number":406,"context_line":"machine.add_transition(RESCUING, RESCUEWAIT, \u0027wait\u0027)"},{"line_number":407,"context_line":"machine.add_transition(RESCUEWAIT, RESCUING, \u0027resume\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_3dbfa1fc","line":404,"updated":"2016-11-15 18:34:14.000000000","message":"It seems like this is already done below since you only added the transition for RESCUEWAIT -\u003e RESCUING, RESCUEWAIT -\u003e RESCUEFAIL, and RESCUEWAIT -\u003e DELETING, and not for RESCUEWAIT -\u003e RESCUE","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":401,"context_line":"# A rescue may succeed."},{"line_number":402,"context_line":"machine.add_transition(RESCUING, RESCUE, \u0027done\u0027)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"# TODO(jcook): Ensure RESCUEWAIT goes to RESCUING not RESCUE"},{"line_number":405,"context_line":"# A rescue may also wait on external callbacks"},{"line_number":406,"context_line":"machine.add_transition(RESCUING, RESCUEWAIT, \u0027wait\u0027)"},{"line_number":407,"context_line":"machine.add_transition(RESCUEWAIT, RESCUING, \u0027resume\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_8d00dc67","line":404,"in_reply_to":"7a77a97e_3dbfa1fc","updated":"2016-11-18 22:51:31.000000000","message":"Yeah. This comment was to verify that this is the correct behavior. Consensus between Mario, Jay, and Jesse was that yes, this is right behavior. Removed TODO.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"349c0cbbe98a87c5643f544a084948ffcd0c2889","unresolved":false,"context_lines":[{"line_number":401,"context_line":"# A rescue may succeed."},{"line_number":402,"context_line":"machine.add_transition(RESCUING, RESCUE, \u0027done\u0027)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"# TODO(jcook): Ensure RESCUEWAIT goes to RESCUING not RESCUE"},{"line_number":405,"context_line":"# A rescue may also wait on external callbacks"},{"line_number":406,"context_line":"machine.add_transition(RESCUING, RESCUEWAIT, \u0027wait\u0027)"},{"line_number":407,"context_line":"machine.add_transition(RESCUEWAIT, RESCUING, \u0027resume\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_cb1c446d","line":404,"in_reply_to":"7a77a97e_8d00dc67","updated":"2016-11-21 16:09:18.000000000","message":"Thanks","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":"# A failed unrescue may be deleted."},{"line_number":447,"context_line":"machine.add_transition(UNRESCUEFAIL, DELETING, \u0027delete\u0027)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"# Start power credentials verification"},{"line_number":450,"context_line":"machine.add_transition(ENROLL, VERIFYING, \u0027manage\u0027)"},{"line_number":451,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_3df321a0","line":448,"updated":"2016-11-15 18:34:14.000000000","message":"Why not also:\n\nUNRESCUING -\u003e DELETING\nRESCUING -\u003e DELETING\n\n?\n\nNot part of the spec so no -1 for that, but I\u0027m curious","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":"# A failed unrescue may be deleted."},{"line_number":447,"context_line":"machine.add_transition(UNRESCUEFAIL, DELETING, \u0027delete\u0027)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"# Start power credentials verification"},{"line_number":450,"context_line":"machine.add_transition(ENROLL, VERIFYING, \u0027manage\u0027)"},{"line_number":451,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_c8cf2254","line":448,"in_reply_to":"7a77a97e_3df321a0","updated":"2016-11-18 22:51:31.000000000","message":"We allow a delete from \u0027WAIT\u0027 but not \u0027ING\u0027.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"349c0cbbe98a87c5643f544a084948ffcd0c2889","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":"# A failed unrescue may be deleted."},{"line_number":447,"context_line":"machine.add_transition(UNRESCUEFAIL, DELETING, \u0027delete\u0027)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"# Start power credentials verification"},{"line_number":450,"context_line":"machine.add_transition(ENROLL, VERIFYING, \u0027manage\u0027)"},{"line_number":451,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_cb4a8455","line":448,"in_reply_to":"7a77a97e_c8cf2254","updated":"2016-11-21 16:09:18.000000000","message":"+1 after our discussion","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"37d7583f9a20984de8755752cd7c26ec55f8e6f2","unresolved":false,"context_lines":[{"line_number":397,"context_line":""},{"line_number":398,"context_line":"# A rescue may also wait on external callbacks"},{"line_number":399,"context_line":"machine.add_transition(RESCUING, RESCUEWAIT, \u0027wait\u0027)"},{"line_number":400,"context_line":"machine.add_transition(RESCUEWAIT, RESCUING, \u0027resume\u0027)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"# A rescued node may be re-rescued."},{"line_number":403,"context_line":"machine.add_transition(RESCUE, RESCUING, \u0027rescue\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_cb80c48e","line":400,"updated":"2016-11-21 16:10:04.000000000","message":"Just commenting so it\u0027s remembered: this is the correct behavior IMO (rescuewait -\u003e rescuing -\u003e rescue), but this will require a spec update. Spec assumed that a node immediately goes from RESCUEWAIT -\u003e RESCUE which is not correct: https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/implement-rescue-mode.html#state-machine-impact","commit_id":"b9ab11b1da2b520a934b4408da76dba050905a38"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a9459701be9613ac8926f199a2d9ec0156eaefe1","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                         VERIFYING, ADOPTFAIL)"},{"line_number":214,"context_line":"\"\"\"Transitional states in which we allow updating a node.\"\"\""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"DELETE_ALLOWED_STATES \u003d (AVAILABLE, MANAGEABLE, ENROLL, ADOPTFAIL)"},{"line_number":217,"context_line":"\"\"\"States in which node deletion is allowed.\"\"\""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba5201f7_d1ea9a0e","line":216,"updated":"2017-01-05 15:40:22.000000000","message":"We have to put RESCUEWAIT, RESCUE, UNRESCUEFAIL, and RESCUEFAIL here to match the state machine impact section of https://review.openstack.org/#/c/407236, right?\n\nThis actually brings up an interesting question.... One of the reasons for having DELETE_ALLOWED_STATES is to make sure the operator is absolutely sure they want to delete a node that potentially has tenant data on it: https://github.com/openstack/ironic/blob/a5a1a31761525a2cb34997454a1f7955eadd5ad4/ironic/conductor/manager.py#L1517\n\nMaybe we should have the transitions to DELETING be transitions to MANAGEABLE instead, to match that pattern. And instead of RESCUEWAIT -\u003e DELETING, allow the operator to use the \"abort\" API call to send a RESCUEWAIT node into RESCUEFAIL, before putting it in MANAGEABLE and finally delete it.","commit_id":"f3dbb7d8914022c002a28636ab873e8ccd12cc1d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a73bc06ef98edfddeaa8e220b4ba260b8c690fa4","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                         VERIFYING, ADOPTFAIL)"},{"line_number":214,"context_line":"\"\"\"Transitional states in which we allow updating a node.\"\"\""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"DELETE_ALLOWED_STATES \u003d (AVAILABLE, MANAGEABLE, ENROLL, ADOPTFAIL)"},{"line_number":217,"context_line":"\"\"\"States in which node deletion is allowed.\"\"\""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba5201f7_03e059f9","line":216,"in_reply_to":"ba5201f7_d1ea9a0e","updated":"2017-01-05 15:50:13.000000000","message":"I don\u0027t think so...  These states are for deletion from the API, as in removal of database records for when an operator can just completely nuke the machine from orbit.","commit_id":"f3dbb7d8914022c002a28636ab873e8ccd12cc1d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"87665a9c515b9b522a575facd2eb41bffaf21bae","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                         VERIFYING, ADOPTFAIL)"},{"line_number":214,"context_line":"\"\"\"Transitional states in which we allow updating a node.\"\"\""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"DELETE_ALLOWED_STATES \u003d (AVAILABLE, MANAGEABLE, ENROLL, ADOPTFAIL)"},{"line_number":217,"context_line":"\"\"\"States in which node deletion is allowed.\"\"\""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba5201f7_63d92522","line":216,"in_reply_to":"ba5201f7_d1ea9a0e","updated":"2017-01-05 15:53:55.000000000","message":"This is about deleting the node from the database.\n\nThese are states in which one CAN issue a DELETE /v1/nodes/foo. Absence of a state here implies that one cannot make that API call, which is correct for the rescue states.","commit_id":"f3dbb7d8914022c002a28636ab873e8ccd12cc1d"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":194,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":197,"context_line":"\"\"\" Node is waiting on an external callback."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"This will be the node `provision_state` while the node is waiting for"},{"line_number":200,"context_line":"the driver to finish rescue."}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_6b95e6e2","line":197,"updated":"2017-01-19 21:52:22.000000000","message":"on/for","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"eff4762e53eef2f78f0450ab1f4d7db0c6ab44b3","unresolved":false,"context_lines":[{"line_number":194,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":197,"context_line":"\"\"\" Node is waiting on an external callback."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"This will be the node `provision_state` while the node is waiting for"},{"line_number":200,"context_line":"the driver to finish rescue."}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_9e41720e","line":197,"in_reply_to":"5a3905b3_6b95e6e2","updated":"2017-01-19 21:54:34.000000000","message":"either is OK I think :)\n\nhttp://english.stackexchange.com/questions/44452/wait-on-vs-wait-for","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"243b02b32595b093a610855bd6cf98baeba26ae3","unresolved":false,"context_lines":[{"line_number":204,"context_line":"\"\"\" Node is waiting to be rescued. \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":207,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"UNRESCUING \u003d \u0027unrescuing\u0027"},{"line_number":210,"context_line":"\"\"\" Node is unrescuing. \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_21abff1e","line":207,"range":{"start_line":207,"start_character":9,"end_line":207,"end_character":15},"updated":"2017-01-19 22:38:47.000000000","message":"Should it be unrescue?","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":204,"context_line":"\"\"\" Node is waiting to be rescued. \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":207,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"UNRESCUING \u003d \u0027unrescuing\u0027"},{"line_number":210,"context_line":"\"\"\" Node is unrescuing. \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_482d5e45","line":207,"range":{"start_line":207,"start_character":9,"end_line":207,"end_character":15},"in_reply_to":"5a3905b3_21abff1e","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"dcb81de028c3f97273e034dac71e0fa8e7bf01d5","unresolved":false,"context_lines":[{"line_number":408,"context_line":"machine.add_transition(RESCUING, RESCUEWAIT, \u0027wait\u0027)"},{"line_number":409,"context_line":"machine.add_transition(RESCUEWAIT, RESCUING, \u0027resume\u0027)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"# A rescued node may be re-rescued."},{"line_number":412,"context_line":"machine.add_transition(RESCUE, RESCUING, \u0027rescue\u0027)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"# A rescued node may be deleted."}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_72095795","line":411,"range":{"start_line":411,"start_character":0,"end_line":411,"end_character":35},"updated":"2017-01-20 04:14:32.000000000","message":"Trying to understand: If a node is already in rescue state, why can it go to rescue state again?\n\nWhat\u0027s the advantage of allowing rescue -\u003e rescue, versus forcing clients to go from rescue -\u003e unrescue -\u003e active, to be able to call rescue again?\n\nhttp://pasteboard.co/o8oUkKYAX.png","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":408,"context_line":"machine.add_transition(RESCUING, RESCUEWAIT, \u0027wait\u0027)"},{"line_number":409,"context_line":"machine.add_transition(RESCUEWAIT, RESCUING, \u0027resume\u0027)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"# A rescued node may be re-rescued."},{"line_number":412,"context_line":"machine.add_transition(RESCUE, RESCUING, \u0027rescue\u0027)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"# A rescued node may be deleted."}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_4861de38","line":411,"range":{"start_line":411,"start_character":0,"end_line":411,"end_character":35},"in_reply_to":"5a3905b3_72095795","updated":"2017-01-20 18:15:26.000000000","message":"If you don\u0027t store the rescue password that is returned somewhere (i.e. in your brain, bash history, write it down), you will not be able to log in. This requires you to re-rescue. Forcing someone to unrescue, then rescue after they\u0027ve failed to store the password just so they can log in is just mean :) Also, rescue from active can result in a hard power off from your production filesystem which can lead to corruption. Best to minimize that as much as possible.","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2fea75de3cb043375e5954a395563dd75b724bac","unresolved":false,"context_lines":[{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":197,"context_line":"\"\"\" Node is waiting on an external callback."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"This will be the node `provision_state` while the node is waiting for"},{"line_number":200,"context_line":"the driver to finish rescue."},{"line_number":201,"context_line":"\"\"\""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"RESCUING \u003d \u0027rescuing\u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_6a4a25c7","line":200,"range":{"start_line":199,"start_character":0,"end_line":200,"end_character":28},"updated":"2017-03-08 11:35:01.000000000","message":"Same for RESCUING and UNRESCUING right ?\n\nI know it\u0027s set on other strings in this module, but *WAIT is used when the node is waiting for the ramdisk to finish whatever it\u0027s doing","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":197,"context_line":"\"\"\" Node is waiting on an external callback."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"This will be the node `provision_state` while the node is waiting for"},{"line_number":200,"context_line":"the driver to finish rescue."},{"line_number":201,"context_line":"\"\"\""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"RESCUING \u003d \u0027rescuing\u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_e4eb6176","line":200,"range":{"start_line":199,"start_character":0,"end_line":200,"end_character":28},"in_reply_to":"9a30ddce_6a4a25c7","updated":"2017-03-21 19:16:54.000000000","message":"RESCUING/UNRESCUING occur when ironic is doing operations for rescue/unrescue (e.g. applying networks)\n\nRESCUEWAIT is when ironic is waiting on an external callback (L197). I didn\u0027t specify \"ramdisk\" here in case another driver has an implementation that needs RESCUEWAIT. I can think of Oneview using something like this in the future, for example.\n\nDo you have a suggestion for improving these docstrings?","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"efaf3ca0a2cfd932ef6194551484a90305385475","unresolved":false,"context_lines":[{"line_number":219,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"},{"line_number":220,"context_line":"\"\"\"States that will not transition unless receiving a request.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"UNSTABLE_STATES \u003d (DEPLOYING, DEPLOYWAIT, CLEANING, CLEANWAIT, VERIFYING,"},{"line_number":223,"context_line":"                   DELETING, INSPECTING, ADOPTING)"},{"line_number":224,"context_line":"\"\"\"States that can be changed without external request.\"\"\""},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3a1ff146_305a4c50","line":222,"updated":"2017-03-16 12:36:58.000000000","message":"Please add rescue related states here.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":219,"context_line":"STABLE_STATES \u003d (ENROLL, MANAGEABLE, AVAILABLE, ACTIVE, ERROR, RESCUE)"},{"line_number":220,"context_line":"\"\"\"States that will not transition unless receiving a request.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"UNSTABLE_STATES \u003d (DEPLOYING, DEPLOYWAIT, CLEANING, CLEANWAIT, VERIFYING,"},{"line_number":223,"context_line":"                   DELETING, INSPECTING, ADOPTING)"},{"line_number":224,"context_line":"\"\"\"States that can be changed without external request.\"\"\""},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_047a3dbd","line":222,"in_reply_to":"3a1ff146_305a4c50","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"038df871b643e82f59093d4c8b54846d2a2eaabe","unresolved":false,"context_lines":[{"line_number":190,"context_line":"RESCUE \u003d \u0027rescue\u0027"},{"line_number":191,"context_line":"\"\"\" Node is in rescue mode. \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"RESCUEFAIL \u003d \u0027rescuefail\u0027"},{"line_number":194,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_047230e6","line":193,"updated":"2017-06-30 13:15:54.000000000","message":"\u0027rescue failed\u0027 would be better for consistency with other states such as \u0027deploy failed\u0027 and \u0027clean failed\u0027.","commit_id":"df4a6e7740e3f9c5f8467f4c8f3589750813f240"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bb3919390326fddb2857dfcee26b1cfccd052c73","unresolved":false,"context_lines":[{"line_number":190,"context_line":"RESCUE \u003d \u0027rescue\u0027"},{"line_number":191,"context_line":"\"\"\" Node is in rescue mode. \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"RESCUEFAIL \u003d \u0027rescuefail\u0027"},{"line_number":194,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_e02816e3","line":193,"in_reply_to":"3f1d235d_047230e6","updated":"2017-07-03 11:50:16.000000000","message":"Done","commit_id":"df4a6e7740e3f9c5f8467f4c8f3589750813f240"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"038df871b643e82f59093d4c8b54846d2a2eaabe","unresolved":false,"context_lines":[{"line_number":193,"context_line":"RESCUEFAIL \u003d \u0027rescuefail\u0027"},{"line_number":194,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":197,"context_line":"\"\"\" Node is waiting on an external callback."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"This will be the node `provision_state` while the node is waiting for"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_4436e805","line":196,"range":{"start_line":196,"start_character":14,"end_line":196,"end_character":24},"updated":"2017-06-30 13:15:54.000000000","message":"\u0027rescue wait\u0027 would be better since \u0027clean wait\u0027 already exists.","commit_id":"df4a6e7740e3f9c5f8467f4c8f3589750813f240"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bb3919390326fddb2857dfcee26b1cfccd052c73","unresolved":false,"context_lines":[{"line_number":193,"context_line":"RESCUEFAIL \u003d \u0027rescuefail\u0027"},{"line_number":194,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":197,"context_line":"\"\"\" Node is waiting on an external callback."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"This will be the node `provision_state` while the node is waiting for"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_801de2be","line":196,"range":{"start_line":196,"start_character":14,"end_line":196,"end_character":24},"in_reply_to":"3f1d235d_4436e805","updated":"2017-07-03 11:50:16.000000000","message":"Done","commit_id":"df4a6e7740e3f9c5f8467f4c8f3589750813f240"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"038df871b643e82f59093d4c8b54846d2a2eaabe","unresolved":false,"context_lines":[{"line_number":203,"context_line":"RESCUING \u003d \u0027rescuing\u0027"},{"line_number":204,"context_line":"\"\"\" Node is waiting to be rescued. \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":207,"context_line":"\"\"\" Node unrescue failed. \"\"\""},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"UNRESCUING \u003d \u0027unrescuing\u0027"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_641a047e","line":206,"range":{"start_line":206,"start_character":15,"end_line":206,"end_character":29},"updated":"2017-06-30 13:15:54.000000000","message":"\u0027unrescue failed\u0027 for the same reason.","commit_id":"df4a6e7740e3f9c5f8467f4c8f3589750813f240"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bb3919390326fddb2857dfcee26b1cfccd052c73","unresolved":false,"context_lines":[{"line_number":203,"context_line":"RESCUING \u003d \u0027rescuing\u0027"},{"line_number":204,"context_line":"\"\"\" Node is waiting to be rescued. \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":207,"context_line":"\"\"\" Node unrescue failed. \"\"\""},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"UNRESCUING \u003d \u0027unrescuing\u0027"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_607ac6f1","line":206,"range":{"start_line":206,"start_character":15,"end_line":206,"end_character":29},"in_reply_to":"3f1d235d_641a047e","updated":"2017-07-03 11:50:16.000000000","message":"Done","commit_id":"df4a6e7740e3f9c5f8467f4c8f3589750813f240"}],"ironic/conductor/manager.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                 rescue mode."},{"line_number":414,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":415,"context_line":"                 async task."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        \"\"\""},{"line_number":418,"context_line":"        LOG.debug(\"RPC do_node_rescue called for node %s.\", node_id)"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_7d7919fc","line":416,"updated":"2016-11-15 18:34:14.000000000","message":":raises: InvalidStateRequested, also should add that to the messaging decorator","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                 rescue mode."},{"line_number":414,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":415,"context_line":"                 async task."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        \"\"\""},{"line_number":418,"context_line":"        LOG.debug(\"RPC do_node_rescue called for node %s.\", node_id)"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_52e900b6","line":416,"in_reply_to":"7a77a97e_7d7919fc","updated":"2016-11-18 22:51:31.000000000","message":"Done","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"},{"line_number":457,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":458,"context_line":"        else:"},{"line_number":459,"context_line":"            LOG.error(_LE(\u0027Driver returned invalid state %(state)s for node\u0027"},{"line_number":460,"context_line":"                          \u0027 %(node)s, failed to rescue\u0027),"},{"line_number":461,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":462,"context_line":"            node.last_error \u003d _(\"Failed to rescue. Driver return invalid \""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_bd9f3102","line":459,"updated":"2016-11-15 18:34:14.000000000","message":"It\u0027s possible for next_state to be RESCUEFAIL too, right? I think a different last_error should be set in that case, since this isn\u0027t an invalid state but an error state.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"},{"line_number":457,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":458,"context_line":"        else:"},{"line_number":459,"context_line":"            LOG.error(_LE(\u0027Driver returned invalid state %(state)s for node\u0027"},{"line_number":460,"context_line":"                          \u0027 %(node)s, failed to rescue\u0027),"},{"line_number":461,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":462,"context_line":"            node.last_error \u003d _(\"Failed to rescue. Driver return invalid \""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_b2da5415","line":459,"in_reply_to":"7a77a97e_bd9f3102","updated":"2016-11-18 22:51:31.000000000","message":"Done","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        :raises: InstanceUnRescueFailure if the node fails to be unrescued"},{"line_number":478,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":479,"context_line":"                 async task"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        \"\"\""},{"line_number":482,"context_line":"        LOG.debug(\"RPC do_node_unrescue called for node %s.\", node_id)"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_1d52e567","line":480,"updated":"2016-11-15 18:34:14.000000000","message":":raises: InvalidStateRequested, also should add that to the messaging decorator","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        :raises: InstanceUnRescueFailure if the node fails to be unrescued"},{"line_number":478,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":479,"context_line":"                 async task"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        \"\"\""},{"line_number":482,"context_line":"        LOG.debug(\"RPC do_node_unrescue called for node %s.\", node_id)"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_d2d510e5","line":480,"in_reply_to":"7a77a97e_1d52e567","updated":"2016-11-18 22:51:31.000000000","message":"Done","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":518,"context_line":"        if next_state \u003d\u003d states.ACTIVE:"},{"line_number":519,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":520,"context_line":"        else:"},{"line_number":521,"context_line":"            LOG.error(_LE(\u0027Driver returned invalid state %(state)s for node\u0027"},{"line_number":522,"context_line":"                          \u0027 %(node)s, failed to unrescue\u0027),"},{"line_number":523,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":524,"context_line":"            node.last_error \u003d _(\"Failed to unrescue. Driver return invalid \""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_fd89a9cb","line":521,"updated":"2016-11-15 18:34:14.000000000","message":"Similar to L459 - isn\u0027t it possible for next_state to be UNRESCUEFAIL?","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":518,"context_line":"        if next_state \u003d\u003d states.ACTIVE:"},{"line_number":519,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":520,"context_line":"        else:"},{"line_number":521,"context_line":"            LOG.error(_LE(\u0027Driver returned invalid state %(state)s for node\u0027"},{"line_number":522,"context_line":"                          \u0027 %(node)s, failed to unrescue\u0027),"},{"line_number":523,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":524,"context_line":"            node.last_error \u003d _(\"Failed to unrescue. Driver return invalid \""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_120a288a","line":521,"in_reply_to":"7a77a97e_fd89a9cb","updated":"2016-11-18 22:51:31.000000000","message":"Done","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"37d7583f9a20984de8755752cd7c26ec55f8e6f2","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":412,"context_line":"        :raises: InstanceRescueFailure if the node cannot be placed into"},{"line_number":413,"context_line":"                 rescue mode."},{"line_number":414,"context_line":"        :raises: InvalidStateRequested if the state tranistion is not supported"},{"line_number":415,"context_line":"                 or allowed."},{"line_number":416,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":417,"context_line":"                 async task."}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_aeab96d5","line":414,"updated":"2016-11-21 16:10:04.000000000","message":"This also needs to be added to the expected_exceptions decorator on L403. Otherwise, I believe the RPC server will consider this a fatal error: http://docs.openstack.org/developer/oslo.messaging/server.html#oslo_messaging.expected_exceptions","commit_id":"b9ab11b1da2b520a934b4408da76dba050905a38"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"28e28867759b1c0c4019726982ccd0f0fd048c32","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":412,"context_line":"        :raises: InstanceRescueFailure if the node cannot be placed into"},{"line_number":413,"context_line":"                 rescue mode."},{"line_number":414,"context_line":"        :raises: InvalidStateRequested if the state tranistion is not supported"},{"line_number":415,"context_line":"                 or allowed."},{"line_number":416,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":417,"context_line":"                 async task."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_8f320d0f","line":414,"in_reply_to":"7a77a97e_aeab96d5","updated":"2016-12-02 19:58:56.000000000","message":"Done","commit_id":"b9ab11b1da2b520a934b4408da76dba050905a38"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"37d7583f9a20984de8755752cd7c26ec55f8e6f2","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        :param context: an admin context."},{"line_number":479,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":480,"context_line":"        :raises: InstanceUnRescueFailure if the node fails to be unrescued"},{"line_number":481,"context_line":"        :raises: InvalidStateRequested if the state tranistion is not supported"},{"line_number":482,"context_line":"                 or allowed."},{"line_number":483,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":484,"context_line":"                 async task"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_2e86a665","line":481,"updated":"2016-11-21 16:10:04.000000000","message":"ditto, this needs to be added to the decorator on L471","commit_id":"b9ab11b1da2b520a934b4408da76dba050905a38"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"28e28867759b1c0c4019726982ccd0f0fd048c32","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        :param context: an admin context."},{"line_number":479,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":480,"context_line":"        :raises: InstanceUnRescueFailure if the node fails to be unrescued"},{"line_number":481,"context_line":"        :raises: InvalidStateRequested if the state tranistion is not supported"},{"line_number":482,"context_line":"                 or allowed."},{"line_number":483,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":484,"context_line":"                 async task"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_af3509f8","line":481,"in_reply_to":"7a77a97e_2e86a665","updated":"2016-12-02 19:58:56.000000000","message":"Done","commit_id":"b9ab11b1da2b520a934b4408da76dba050905a38"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"fd18667182cef5a5492adbe46d9f557bb21ae77e","unresolved":false,"context_lines":[{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":458,"context_line":"            try:"},{"line_number":459,"context_line":"                task.driver.power.validate(task)"},{"line_number":460,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":461,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":462,"context_line":"                raise exception.InstanceRescueFailure("}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_3aa3e1b3","line":459,"updated":"2017-01-04 20:44:21.000000000","message":"You need a task.driver.rescue.validate(task) here as well. See https://review.openstack.org/#/c/400437/8/ironic/drivers/modules/agent.py for an example of agent driver rescue validation (hasn\u0027t merged yet)","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"e0415c163aaef403561e27091c87e434312b9619","unresolved":false,"context_lines":[{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":458,"context_line":"            try:"},{"line_number":459,"context_line":"                task.driver.power.validate(task)"},{"line_number":460,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":461,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":462,"context_line":"                raise exception.InstanceRescueFailure("}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_c74d9d3f","line":459,"in_reply_to":"ba5201f7_3aa3e1b3","updated":"2017-01-04 23:01:29.000000000","message":"Done","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"fd18667182cef5a5492adbe46d9f557bb21ae77e","unresolved":false,"context_lines":[{"line_number":461,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":462,"context_line":"                raise exception.InstanceRescueFailure("},{"line_number":463,"context_line":"                    node\u003dnode_id,"},{"line_number":464,"context_line":"                    reason\u003d_(\"RPC do_node_rescue failed to validate power \""},{"line_number":465,"context_line":"                             \"info. Error: %(msg)s\") % {\u0027msg\u0027: e})"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_ba97d146","line":464,"updated":"2017-01-04 20:44:21.000000000","message":"will need to update this message too, after rescue validation is added","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"e0415c163aaef403561e27091c87e434312b9619","unresolved":false,"context_lines":[{"line_number":461,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":462,"context_line":"                raise exception.InstanceRescueFailure("},{"line_number":463,"context_line":"                    node\u003dnode_id,"},{"line_number":464,"context_line":"                    reason\u003d_(\"RPC do_node_rescue failed to validate power \""},{"line_number":465,"context_line":"                             \"info. Error: %(msg)s\") % {\u0027msg\u0027: e})"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_e74aa125","line":464,"in_reply_to":"ba5201f7_ba97d146","updated":"2017-01-04 23:01:29.000000000","message":"Done","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"fd18667182cef5a5492adbe46d9f557bb21ae77e","unresolved":false,"context_lines":[{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":533,"context_line":"            try:"},{"line_number":534,"context_line":"                task.driver.power.validate(task)"},{"line_number":535,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":536,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":537,"context_line":"                raise exception.InstanceUnRescueFailure("}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_7a97293a","line":534,"updated":"2017-01-04 20:44:21.000000000","message":"just noting, rescue validation will *not* be needed here (leave as-is)","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"83ded942192025c847aff227e13467ef2fe9c89f","unresolved":false,"context_lines":[{"line_number":513,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":514,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":515,"context_line":"                                     \"state: %s\") % next_state"},{"line_number":516,"context_line":"            task.node.save()"},{"line_number":517,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba5201f7_e696033d","line":516,"updated":"2017-01-05 16:17:04.000000000","message":"the save() here is unneeded, process_event will save the node for you: https://github.com/openstack/ironic/blob/master/ironic/conductor/task_manager.py#L427\n\nThere are some other examples of this in this file (grep for process_event(\u0027fail\u0027) ). It seems like you\u0027re already following this pattern for the unrescue cases.","commit_id":"f3dbb7d8914022c002a28636ab873e8ccd12cc1d"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"b3b9d3701ac2df27ee224f2550495065d357c8cf","unresolved":false,"context_lines":[{"line_number":513,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":514,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":515,"context_line":"                                     \"state: %s\") % next_state"},{"line_number":516,"context_line":"            task.node.save()"},{"line_number":517,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba5201f7_836a7ab1","line":516,"in_reply_to":"ba5201f7_e696033d","updated":"2017-01-05 21:56:33.000000000","message":"Done","commit_id":"f3dbb7d8914022c002a28636ab873e8ccd12cc1d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"99a9ac6505267a61125e8b446d42acd9b4e2a9d7","unresolved":false,"context_lines":[{"line_number":532,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":533,"context_line":"        else:"},{"line_number":534,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"},{"line_number":535,"context_line":"                          \u0027failed to rescue\u0027),"},{"line_number":536,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":537,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":538,"context_line":"                                     \"state: %s\") % next_state"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_1e5662d2","line":535,"updated":"2017-01-19 21:59:43.000000000","message":"Maybe say that expected to see either \u0027wait\u0027 or \u0027done\u0027","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":532,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":533,"context_line":"        else:"},{"line_number":534,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"},{"line_number":535,"context_line":"                          \u0027failed to rescue\u0027),"},{"line_number":536,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":537,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":538,"context_line":"                                     \"state: %s\") % next_state"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_88b74685","line":535,"in_reply_to":"5a3905b3_1e5662d2","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":581,"context_line":"                    action\u003d\u0027unrescue\u0027, node\u003dtask.node.uuid,"},{"line_number":582,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":583,"context_line":""},{"line_number":584,"context_line":"    def _do_node_unrescue(self, task):"},{"line_number":585,"context_line":"        \"\"\"Internal RPC method to unrescue a node in rescue mode.\"\"\""},{"line_number":586,"context_line":"        node \u003d task.node"},{"line_number":587,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_eb5e3644","line":584,"updated":"2017-01-19 21:52:22.000000000","message":"params?","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"243b02b32595b093a610855bd6cf98baeba26ae3","unresolved":false,"context_lines":[{"line_number":581,"context_line":"                    action\u003d\u0027unrescue\u0027, node\u003dtask.node.uuid,"},{"line_number":582,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":583,"context_line":""},{"line_number":584,"context_line":"    def _do_node_unrescue(self, task):"},{"line_number":585,"context_line":"        \"\"\"Internal RPC method to unrescue a node in rescue mode.\"\"\""},{"line_number":586,"context_line":"        node \u003d task.node"},{"line_number":587,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_61d34739","line":584,"in_reply_to":"5a3905b3_eb5e3644","updated":"2017-01-19 22:38:47.000000000","message":"I think docstring is not being include in internal methods, only in the public ones.","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":588,"context_line":"            next_state \u003d task.driver.rescue.unrescue(task)"},{"line_number":589,"context_line":"        except Exception as e:"},{"line_number":590,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":591,"context_line":"                LOG.exception(_LE(\u0027Error in unrescue of node %(node)s: \u0027"},{"line_number":592,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":593,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":594,"context_line":"                node.last_error \u003d _(\"Failed to unrescue. Error: %s\") % e"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_6b4a4685","line":591,"updated":"2017-01-19 21:52:22.000000000","message":"Error in/Failed to","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":588,"context_line":"            next_state \u003d task.driver.rescue.unrescue(task)"},{"line_number":589,"context_line":"        except Exception as e:"},{"line_number":590,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":591,"context_line":"                LOG.exception(_LE(\u0027Error in unrescue of node %(node)s: \u0027"},{"line_number":592,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":593,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":594,"context_line":"                node.last_error \u003d _(\"Failed to unrescue. Error: %s\") % e"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_883ca6e3","line":591,"in_reply_to":"5a3905b3_6b4a4685","updated":"2017-01-20 18:15:26.000000000","message":"While maybe subpar English, I like \u0027error in\u0027 better than \u0027failed to\u0027 for log files. It tells the developer that it\u0027s in the unrescue code.","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"0945e676bd0733104e6ae43a3ee599c31d3e3004","unresolved":false,"context_lines":[{"line_number":512,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":513,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""},{"line_number":514,"context_line":"        instance_info \u003d task.node.instance_info"},{"line_number":515,"context_line":"        instance_info[\u0027rescue_password\u0027] \u003d rescue_password"},{"line_number":516,"context_line":"        task.node.instance_info \u003d instance_info"},{"line_number":517,"context_line":"        task.node.save()"},{"line_number":518,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a3905b3_cf7c54ee","line":515,"updated":"2017-01-24 21:19:53.000000000","message":"TODO: Error handling to remove rescue password on fail","commit_id":"1bce0af632d7b4b8647134dbb7c43da782237292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"03415511c3906c703ede822af5493b982326b509","unresolved":false,"context_lines":[{"line_number":512,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":513,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""},{"line_number":514,"context_line":"        instance_info \u003d task.node.instance_info"},{"line_number":515,"context_line":"        instance_info[\u0027rescue_password\u0027] \u003d rescue_password"},{"line_number":516,"context_line":"        task.node.instance_info \u003d instance_info"},{"line_number":517,"context_line":"        task.node.save()"},{"line_number":518,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a461143_332538ab","line":515,"in_reply_to":"5a3905b3_0fd57cb8","updated":"2017-01-25 21:33:55.000000000","message":"Done","commit_id":"1bce0af632d7b4b8647134dbb7c43da782237292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"03415511c3906c703ede822af5493b982326b509","unresolved":false,"context_lines":[{"line_number":512,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":513,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""},{"line_number":514,"context_line":"        instance_info \u003d task.node.instance_info"},{"line_number":515,"context_line":"        instance_info[\u0027rescue_password\u0027] \u003d rescue_password"},{"line_number":516,"context_line":"        task.node.instance_info \u003d instance_info"},{"line_number":517,"context_line":"        task.node.save()"},{"line_number":518,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a461143_3387f810","line":515,"in_reply_to":"5a3905b3_cf7c54ee","updated":"2017-01-25 21:33:55.000000000","message":"Done, also removed on unrescue success.\n\nI think it might be fine to keep it on the node while the node\u0027s in rescue, though, in case the driver needs it for whatever reason. The API will mask any retrieval attempts, anyway.\n\nIf we remove it after ACTIVE -\u003e RESCUE or RESCUEWAIT -\u003e RESCUE, though, I think that\u0027d be good to do in the driver as well, especially since this method won\u0027t be able to tell when RESCUEWAIT advances state.","commit_id":"1bce0af632d7b4b8647134dbb7c43da782237292"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"8494df567e72c3dc6abbfe9a4f8c1a3e0154b12e","unresolved":false,"context_lines":[{"line_number":512,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":513,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""},{"line_number":514,"context_line":"        instance_info \u003d task.node.instance_info"},{"line_number":515,"context_line":"        instance_info[\u0027rescue_password\u0027] \u003d rescue_password"},{"line_number":516,"context_line":"        task.node.instance_info \u003d instance_info"},{"line_number":517,"context_line":"        task.node.save()"},{"line_number":518,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a3905b3_0fd57cb8","line":515,"in_reply_to":"5a3905b3_cf7c54ee","updated":"2017-01-24 21:20:28.000000000","message":"We validate the interface on #493, which doesn\u0027t work because rescue password isn\u0027t set until here. We need to set this on the node early.","commit_id":"1bce0af632d7b4b8647134dbb7c43da782237292"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"bae54d62ed02ccf1e470e2cd5d66228a16fa5a00","unresolved":false,"context_lines":[{"line_number":533,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":534,"context_line":"        else:"},{"line_number":535,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"},{"line_number":536,"context_line":"                          \u0027expected wait or done.\u0027),"},{"line_number":537,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":538,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":539,"context_line":"                                     \"state: %s\") % next_state"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a3905b3_6fd64529","line":536,"updated":"2017-01-23 18:33:19.000000000","message":"I think \u0027failed to rescue\u0027 was useful, still :)","commit_id":"1bce0af632d7b4b8647134dbb7c43da782237292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"03415511c3906c703ede822af5493b982326b509","unresolved":false,"context_lines":[{"line_number":533,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":534,"context_line":"        else:"},{"line_number":535,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"},{"line_number":536,"context_line":"                          \u0027expected wait or done.\u0027),"},{"line_number":537,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":538,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":539,"context_line":"                                     \"state: %s\") % next_state"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a461143_e503e70d","line":536,"in_reply_to":"5a3905b3_286c2e34","updated":"2017-01-25 21:33:55.000000000","message":"Done","commit_id":"1bce0af632d7b4b8647134dbb7c43da782237292"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"2795dff10b0d012bd5cbe186117a819585dbf498","unresolved":false,"context_lines":[{"line_number":533,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":534,"context_line":"        else:"},{"line_number":535,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"},{"line_number":536,"context_line":"                          \u0027expected wait or done.\u0027),"},{"line_number":537,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":538,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":539,"context_line":"                                     \"state: %s\") % next_state"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a3905b3_286c2e34","line":536,"in_reply_to":"5a3905b3_6fd64529","updated":"2017-01-23 21:51:59.000000000","message":"Heh, if I update patch again I\u0027ll try to toss it back in.","commit_id":"1bce0af632d7b4b8647134dbb7c43da782237292"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"3c013ef21f53bf3ce31b049e0c6a7be32ecaf8ec","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":483,"context_line":"            # driver validation may check rescue_password, so save it on the"},{"line_number":484,"context_line":"            # node early"},{"line_number":485,"context_line":"            instance_info \u003d task.node.instance_info"},{"line_number":486,"context_line":"            instance_info[\u0027rescue_password\u0027] \u003d rescue_password"},{"line_number":487,"context_line":"            task.node.instance_info \u003d instance_info"},{"line_number":488,"context_line":"            task.node.save()"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            try:"},{"line_number":491,"context_line":"                task.driver.power.validate(task)"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a461143_1e368003","line":488,"range":{"start_line":485,"start_character":0,"end_line":488,"end_character":28},"updated":"2017-01-25 22:26:49.000000000","message":"Looks like a candidate for a helper method, and the password deletion snippet also (which is used several times).","commit_id":"d3632e498a799fb2e609c3a379746ff45f66a77f"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"3c013ef21f53bf3ce31b049e0c6a7be32ecaf8ec","unresolved":false,"context_lines":[{"line_number":540,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"},{"line_number":541,"context_line":"                instance_info \u003d task.node.instance_info"},{"line_number":542,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":543,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":544,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":545,"context_line":"                # Don\u0027t rescue a broken node."},{"line_number":546,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a461143_b9902697","line":543,"range":{"start_line":543,"start_character":0,"end_line":543,"end_character":55},"updated":"2017-01-25 22:26:49.000000000","message":"Probably missing a task.node.save() after L543, L560, L625.","commit_id":"d3632e498a799fb2e609c3a379746ff45f66a77f"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"3c013ef21f53bf3ce31b049e0c6a7be32ecaf8ec","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":551,"context_line":"        else:"},{"line_number":552,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s \u0027"},{"line_number":553,"context_line":"                          \u0027when attempting to rescue, expected RESCUE or \u0027"},{"line_number":554,"context_line":"                          \u0027RESCUEWAIT.\u0027),"},{"line_number":555,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"},{"line_number":556,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""}],"source_content_type":"text/x-python","patch_set":26,"id":"3a461143_de0078ad","line":553,"range":{"start_line":553,"start_character":63,"end_line":553,"end_character":69},"updated":"2017-01-25 22:26:49.000000000","message":"Nit: maybe we should use lowercase.\n\nI think Joanna meant something like: \"Failed to rescue. Driver returned...\"","commit_id":"d3632e498a799fb2e609c3a379746ff45f66a77f"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"6e579b80c4d42ba11b127ad70ce80bb0a8cb8d69","unresolved":false,"context_lines":[{"line_number":527,"context_line":"            rescue environment."},{"line_number":528,"context_line":"        :raises: InstanceRescueFailure if the node cannot be placed into"},{"line_number":529,"context_line":"                 rescue mode."},{"line_number":530,"context_line":"        :raises: InvalidStateRequested if the state tranistion is not supported"},{"line_number":531,"context_line":"                 or allowed."},{"line_number":532,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":533,"context_line":"                 async task."}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_68905644","line":530,"range":{"start_line":530,"start_character":52,"end_line":530,"end_character":62},"updated":"2017-03-09 05:20:21.000000000","message":"nit: typo; ditto L633","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":527,"context_line":"            rescue environment."},{"line_number":528,"context_line":"        :raises: InstanceRescueFailure if the node cannot be placed into"},{"line_number":529,"context_line":"                 rescue mode."},{"line_number":530,"context_line":"        :raises: InvalidStateRequested if the state tranistion is not supported"},{"line_number":531,"context_line":"                 or allowed."},{"line_number":532,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":533,"context_line":"                 async task."}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_245e5944","line":530,"range":{"start_line":530,"start_character":52,"end_line":530,"end_character":62},"in_reply_to":"9a30ddce_68905644","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":535,"context_line":"        \"\"\""},{"line_number":536,"context_line":"        LOG.debug(\"RPC do_node_rescue called for node %s.\", node_id)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":539,"context_line":"            # driver validation may check rescue_password, so save it on the"},{"line_number":540,"context_line":"            # node early"},{"line_number":541,"context_line":"            instance_info \u003d task.node.instance_info"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_c6dccee6","line":538,"range":{"start_line":538,"start_character":13,"end_line":538,"end_character":65},"updated":"2017-03-09 05:38:10.000000000","message":"Add purpose string. shared\u003dFalse is default. \ntask_manager.acquire(context, node_id, purpose\u003d\u0027node rescue\u0027)","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":535,"context_line":"        \"\"\""},{"line_number":536,"context_line":"        LOG.debug(\"RPC do_node_rescue called for node %s.\", node_id)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":539,"context_line":"            # driver validation may check rescue_password, so save it on the"},{"line_number":540,"context_line":"            # node early"},{"line_number":541,"context_line":"            instance_info \u003d task.node.instance_info"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_273adbcc","line":538,"range":{"start_line":538,"start_character":13,"end_line":538,"end_character":65},"in_reply_to":"9a30ddce_093a5bcc","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d0ffd3190cc41e76f84f07c03f529a44cd4e7cfc","unresolved":false,"context_lines":[{"line_number":535,"context_line":"        \"\"\""},{"line_number":536,"context_line":"        LOG.debug(\"RPC do_node_rescue called for node %s.\", node_id)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":539,"context_line":"            # driver validation may check rescue_password, so save it on the"},{"line_number":540,"context_line":"            # node early"},{"line_number":541,"context_line":"            instance_info \u003d task.node.instance_info"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_093a5bcc","line":538,"range":{"start_line":538,"start_character":13,"end_line":538,"end_character":65},"in_reply_to":"9a30ddce_c6dccee6","updated":"2017-03-09 17:27:36.000000000","message":"Good point about the purpose, that makes it easier for debugging the logs later.\n\n++","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"efaf3ca0a2cfd932ef6194551484a90305385475","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            task.node.instance_info \u003d instance_info"},{"line_number":544,"context_line":"            task.node.save()"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"            try:"},{"line_number":547,"context_line":"                task.driver.power.validate(task)"},{"line_number":548,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":549,"context_line":"                    exception.MissingParameterValue) as e:"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a1ff146_f43b4be9","line":546,"updated":"2017-03-16 12:36:58.000000000","message":"nit: this two block can be merged\n try:\n     reason \u003d ...\n     task.driver.power.validate(task)\n     reason \u003d ...\n     task.driver.rescue.validate(task)","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            task.node.instance_info \u003d instance_info"},{"line_number":544,"context_line":"            task.node.save()"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"            try:"},{"line_number":547,"context_line":"                task.driver.power.validate(task)"},{"line_number":548,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":549,"context_line":"                    exception.MissingParameterValue) as e:"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_8207fdc8","line":546,"in_reply_to":"3a1ff146_f43b4be9","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2fea75de3cb043375e5954a395563dd75b724bac","unresolved":false,"context_lines":[{"line_number":576,"context_line":"                    call_args\u003d(self._do_node_rescue, task, rescue_password),"},{"line_number":577,"context_line":"                    err_handler\u003dutils.provisioning_error_handler)"},{"line_number":578,"context_line":"            except exception.InvalidState:"},{"line_number":579,"context_line":"                instance_info \u003d task.node.instance_info"},{"line_number":580,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":581,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":582,"context_line":"                task.node.save()"},{"line_number":583,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":584,"context_line":"                    action\u003d\u0027rescue\u0027, node\u003dtask.node.uuid,"},{"line_number":585,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":588,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_aa95fde4","line":585,"range":{"start_line":579,"start_character":0,"end_line":585,"end_character":52},"updated":"2017-03-08 11:35:01.000000000","message":"nit: This block, the block from L563-570 and the block from L550-556 are virtually the same, perhaps you want to have a helper method to handle failures with rescue ? \n\nOr bits of it, I see a similar pattern on the lines below too (deleting the rescue_password if something fails)","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":576,"context_line":"                    call_args\u003d(self._do_node_rescue, task, rescue_password),"},{"line_number":577,"context_line":"                    err_handler\u003dutils.provisioning_error_handler)"},{"line_number":578,"context_line":"            except exception.InvalidState:"},{"line_number":579,"context_line":"                instance_info \u003d task.node.instance_info"},{"line_number":580,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":581,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":582,"context_line":"                task.node.save()"},{"line_number":583,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":584,"context_line":"                    action\u003d\u0027rescue\u0027, node\u003dtask.node.uuid,"},{"line_number":585,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":588,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_62c0412b","line":585,"range":{"start_line":579,"start_character":0,"end_line":585,"end_character":52},"in_reply_to":"9a30ddce_4600de01","updated":"2017-03-21 19:16:54.000000000","message":"Added a helper and used everywhere in this file.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":576,"context_line":"                    call_args\u003d(self._do_node_rescue, task, rescue_password),"},{"line_number":577,"context_line":"                    err_handler\u003dutils.provisioning_error_handler)"},{"line_number":578,"context_line":"            except exception.InvalidState:"},{"line_number":579,"context_line":"                instance_info \u003d task.node.instance_info"},{"line_number":580,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":581,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":582,"context_line":"                task.node.save()"},{"line_number":583,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":584,"context_line":"                    action\u003d\u0027rescue\u0027, node\u003dtask.node.uuid,"},{"line_number":585,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":588,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_4600de01","line":585,"range":{"start_line":579,"start_character":0,"end_line":585,"end_character":52},"in_reply_to":"9a30ddce_aa95fde4","updated":"2017-03-09 05:38:10.000000000","message":"++","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":584,"context_line":"                    action\u003d\u0027rescue\u0027, node\u003dtask.node.uuid,"},{"line_number":585,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":588,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""},{"line_number":589,"context_line":"        try:"},{"line_number":590,"context_line":"            next_state \u003d task.driver.rescue.rescue(task)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_a6afda92","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":51},"updated":"2017-03-09 05:38:10.000000000","message":"This arg is not used. Also, \u0027rescue_password\u0027 is available in node.instance_info","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d0ffd3190cc41e76f84f07c03f529a44cd4e7cfc","unresolved":false,"context_lines":[{"line_number":584,"context_line":"                    action\u003d\u0027rescue\u0027, node\u003dtask.node.uuid,"},{"line_number":585,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":588,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""},{"line_number":589,"context_line":"        try:"},{"line_number":590,"context_line":"            next_state \u003d task.driver.rescue.rescue(task)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_e9434740","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":51},"in_reply_to":"9a30ddce_a6afda92","updated":"2017-03-09 17:27:36.000000000","message":"++","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":584,"context_line":"                    action\u003d\u0027rescue\u0027, node\u003dtask.node.uuid,"},{"line_number":585,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def _do_node_rescue(self, task, rescue_password):"},{"line_number":588,"context_line":"        \"\"\"Internal RPC method to rescue an existing node deployment.\"\"\""},{"line_number":589,"context_line":"        try:"},{"line_number":590,"context_line":"            next_state \u003d task.driver.rescue.rescue(task)"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_62d761ed","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":51},"in_reply_to":"9a30ddce_e9434740","updated":"2017-03-21 19:16:54.000000000","message":"Weird that flake8 didn\u0027t catch this. Removed.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":596,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"},{"line_number":597,"context_line":"                instance_info \u003d task.node.instance_info"},{"line_number":598,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":599,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":600,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":601,"context_line":"                # Don\u0027t rescue a broken node."},{"line_number":602,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_4689be25","line":599,"range":{"start_line":599,"start_character":16,"end_line":599,"end_character":55},"updated":"2017-03-09 05:38:10.000000000","message":"Need to save here\ntask.node.save()","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":596,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"},{"line_number":597,"context_line":"                instance_info \u003d task.node.instance_info"},{"line_number":598,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":599,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":600,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":601,"context_line":"                # Don\u0027t rescue a broken node."},{"line_number":602,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_223f2925","line":599,"range":{"start_line":599,"start_character":16,"end_line":599,"end_character":55},"in_reply_to":"9a30ddce_4689be25","updated":"2017-03-21 19:16:54.000000000","message":"process_event handles this: https://github.com/openstack/ironic/blob/master/ironic/conductor/task_manager.py#L481","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":602,"context_line":"                return"},{"line_number":603,"context_line":"        if next_state \u003d\u003d states.RESCUEWAIT:"},{"line_number":604,"context_line":"            task.process_event(\u0027wait\u0027)"},{"line_number":605,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"},{"line_number":606,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":607,"context_line":"        else:"},{"line_number":608,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s \u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_c6276e10","line":605,"range":{"start_line":605,"start_character":8,"end_line":605,"end_character":41},"updated":"2017-03-09 05:38:10.000000000","message":"Won\u0027t it be always \u0027RESCUEWAIT\u0027?\nIs it possible for the driver to bring up the rescue ramdisk in a synchronous way and return \u0027RESCUE\u0027 as next_state?","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":602,"context_line":"                return"},{"line_number":603,"context_line":"        if next_state \u003d\u003d states.RESCUEWAIT:"},{"line_number":604,"context_line":"            task.process_event(\u0027wait\u0027)"},{"line_number":605,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"},{"line_number":606,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":607,"context_line":"        else:"},{"line_number":608,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s \u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_e286f1d9","line":605,"range":{"start_line":605,"start_character":8,"end_line":605,"end_character":41},"in_reply_to":"9a30ddce_c6276e10","updated":"2017-03-21 19:16:54.000000000","message":"This is to allow support for drivers that don\u0027t have async operations during rescue.\n\nThe implementation I\u0027m writing (AgentRescue) will only have async, but it doesn\u0027t mean that a driver in the future couldn\u0027t have synchronous rescue.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                                     \"state: %s\") % next_state"},{"line_number":614,"context_line":"            instance_info \u003d task.node.instance_info"},{"line_number":615,"context_line":"            del instance_info[\u0027rescue_password\u0027]"},{"line_number":616,"context_line":"            task.node.instance_info \u003d instance_info"},{"line_number":617,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_467a9ef2","line":616,"range":{"start_line":616,"start_character":11,"end_line":616,"end_character":51},"updated":"2017-03-09 05:38:10.000000000","message":"Need to save here\ntask.node.save()","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                                     \"state: %s\") % next_state"},{"line_number":614,"context_line":"            instance_info \u003d task.node.instance_info"},{"line_number":615,"context_line":"            del instance_info[\u0027rescue_password\u0027]"},{"line_number":616,"context_line":"            task.node.instance_info \u003d instance_info"},{"line_number":617,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_6273e115","line":616,"range":{"start_line":616,"start_character":11,"end_line":616,"end_character":51},"in_reply_to":"9a30ddce_467a9ef2","updated":"2017-03-21 19:16:54.000000000","message":"process_event will handle this, see above","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":638,"context_line":"        \"\"\""},{"line_number":639,"context_line":"        LOG.debug(\"RPC do_node_unrescue called for node %s.\", node_id)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":642,"context_line":"            try:"},{"line_number":643,"context_line":"                task.driver.power.validate(task)"},{"line_number":644,"context_line":"            except (exception.InvalidParameterValue,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_46effe86","line":641,"range":{"start_line":641,"start_character":13,"end_line":641,"end_character":65},"updated":"2017-03-09 05:38:10.000000000","message":"Add purpose string. shared\u003dFalse is default. \ntask_manager.acquire(context, node_id, purpose\u003d\u0027node unrescue\u0027)","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":638,"context_line":"        \"\"\""},{"line_number":639,"context_line":"        LOG.debug(\"RPC do_node_unrescue called for node %s.\", node_id)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse) as task:"},{"line_number":642,"context_line":"            try:"},{"line_number":643,"context_line":"                task.driver.power.validate(task)"},{"line_number":644,"context_line":"            except (exception.InvalidParameterValue,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_02deaddc","line":641,"range":{"start_line":641,"start_character":13,"end_line":641,"end_character":65},"in_reply_to":"9a30ddce_46effe86","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":669,"context_line":"                LOG.exception(_LE(\u0027Error in unrescue of node %(node)s: \u0027"},{"line_number":670,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":671,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":672,"context_line":"                node.last_error \u003d _(\"Failed to unrescue. Error: %s\") % e"},{"line_number":673,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":674,"context_line":"                # Don\u0027t unrescue a broken node."},{"line_number":675,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_26904aec","line":672,"range":{"start_line":672,"start_character":16,"end_line":672,"end_character":31},"updated":"2017-03-09 05:38:10.000000000","message":"Need to save node\ntask.node.save()","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":669,"context_line":"                LOG.exception(_LE(\u0027Error in unrescue of node %(node)s: \u0027"},{"line_number":670,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":671,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":672,"context_line":"                node.last_error \u003d _(\"Failed to unrescue. Error: %s\") % e"},{"line_number":673,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":674,"context_line":"                # Don\u0027t unrescue a broken node."},{"line_number":675,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_42e425ab","line":672,"range":{"start_line":672,"start_character":16,"end_line":672,"end_character":31},"in_reply_to":"9a30ddce_26904aec","updated":"2017-03-21 19:16:54.000000000","message":"process_event will handle this, see above","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":678,"context_line":"            instance_info \u003d task.node.instance_info"},{"line_number":679,"context_line":"            if \u0027rescue_password\u0027 in instance_info:"},{"line_number":680,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":681,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":682,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":683,"context_line":"        else:"},{"line_number":684,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_c6b12e91","line":681,"range":{"start_line":681,"start_character":16,"end_line":681,"end_character":55},"updated":"2017-03-09 05:38:10.000000000","message":"Need to save node\ntask.node.save()","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":678,"context_line":"            instance_info \u003d task.node.instance_info"},{"line_number":679,"context_line":"            if \u0027rescue_password\u0027 in instance_info:"},{"line_number":680,"context_line":"                del instance_info[\u0027rescue_password\u0027]"},{"line_number":681,"context_line":"                task.node.instance_info \u003d instance_info"},{"line_number":682,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":683,"context_line":"        else:"},{"line_number":684,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_62e1219a","line":681,"range":{"start_line":681,"start_character":16,"end_line":681,"end_character":55},"in_reply_to":"9a30ddce_c6b12e91","updated":"2017-03-21 19:16:54.000000000","message":"process_event will handle this, see above","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":684,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"},{"line_number":685,"context_line":"                          \u0027failed to unrescue\u0027),"},{"line_number":686,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":687,"context_line":"            node.last_error \u003d _(\"Failed to unrescue. Driver returned \""},{"line_number":688,"context_line":"                                \"state: %s\") % next_state"},{"line_number":689,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":690,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_e67392e5","line":687,"range":{"start_line":687,"start_character":12,"end_line":687,"end_character":27},"updated":"2017-03-09 05:38:10.000000000","message":"Need to save node\ntask.node.save()","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":684,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"},{"line_number":685,"context_line":"                          \u0027failed to unrescue\u0027),"},{"line_number":686,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":687,"context_line":"            node.last_error \u003d _(\"Failed to unrescue. Driver returned \""},{"line_number":688,"context_line":"                                \"state: %s\") % next_state"},{"line_number":689,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":690,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_82f0dd68","line":687,"range":{"start_line":687,"start_character":12,"end_line":687,"end_character":27},"in_reply_to":"9a30ddce_e67392e5","updated":"2017-03-21 19:16:54.000000000","message":"process_event will handle this, see above","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"b3dca29a8921bcd82a05dc06badde00cb8005530","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        return get_vendor_passthru_metadata(vendor.driver_routes)"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def _remove_node_rescue_password(self, task):"},{"line_number":513,"context_line":"        \"\"\"Helper to remove rescue password from a node on failure."},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"           It is the responsibility of the caller to save the node after this"},{"line_number":516,"context_line":"           operation."}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_365d9d47","line":513,"range":{"start_line":513,"start_character":0,"end_line":513,"end_character":67},"updated":"2017-03-22 00:05:14.000000000","message":"Helper to remove the rescue password from a node.\n\nOr,\nHelper to remove the rescue password from a node on failure or when unrescue succeeds.","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8e234d4f9e3089f1fa3727cc00e16d7063980a16","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        return get_vendor_passthru_metadata(vendor.driver_routes)"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def _remove_node_rescue_password(self, task):"},{"line_number":513,"context_line":"        \"\"\"Helper to remove rescue password from a node on failure."},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"           It is the responsibility of the caller to save the node after this"},{"line_number":516,"context_line":"           operation."}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_0e62260a","line":513,"range":{"start_line":513,"start_character":0,"end_line":513,"end_character":67},"in_reply_to":"1a1ced50_365d9d47","updated":"2017-03-22 17:57:07.000000000","message":"Done","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"261d1a33a3cef904b9b859310bba98a859a482a0","unresolved":false,"context_lines":[{"line_number":591,"context_line":"            next_state \u003d task.driver.rescue.rescue(task)"},{"line_number":592,"context_line":"        except Exception as e:"},{"line_number":593,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":594,"context_line":"                LOG.exception(_LE(\u0027Error in rescue of node %(node)s: \u0027"},{"line_number":595,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":596,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":597,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_c3956d33","line":594,"updated":"2017-03-21 22:23:06.000000000","message":"_LE has to be removed.","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8e234d4f9e3089f1fa3727cc00e16d7063980a16","unresolved":false,"context_lines":[{"line_number":591,"context_line":"            next_state \u003d task.driver.rescue.rescue(task)"},{"line_number":592,"context_line":"        except Exception as e:"},{"line_number":593,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":594,"context_line":"                LOG.exception(_LE(\u0027Error in rescue of node %(node)s: \u0027"},{"line_number":595,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":596,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":597,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_a9a10cfa","line":594,"in_reply_to":"1a1ced50_99d1225a","updated":"2017-03-22 17:57:07.000000000","message":"I\u0027d really rather that this be done in a follow-up patch that removes log translation in organized batches of modules, since this patch has been under review for quite a long time.\n\nThere are 50 existing cases of _LE, _LW, and _LI in this file alone: http://paste.openstack.org/show/603794/","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"b3dca29a8921bcd82a05dc06badde00cb8005530","unresolved":false,"context_lines":[{"line_number":591,"context_line":"            next_state \u003d task.driver.rescue.rescue(task)"},{"line_number":592,"context_line":"        except Exception as e:"},{"line_number":593,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":594,"context_line":"                LOG.exception(_LE(\u0027Error in rescue of node %(node)s: \u0027"},{"line_number":595,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":596,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":597,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_99d1225a","line":594,"in_reply_to":"1a1ced50_c3956d33","updated":"2017-03-22 00:05:14.000000000","message":"We can leave them if we don\u0027t want to deal with removing translations in this patch. As long as https://review.openstack.org/#/c/448196/ is not merged, we\u0027re on the safe side.","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"261d1a33a3cef904b9b859310bba98a859a482a0","unresolved":false,"context_lines":[{"line_number":604,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"},{"line_number":605,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":606,"context_line":"        else:"},{"line_number":607,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s \u0027"},{"line_number":608,"context_line":"                          \u0027when attempting to rescue, expected RESCUE or \u0027"},{"line_number":609,"context_line":"                          \u0027RESCUEWAIT.\u0027),"},{"line_number":610,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_43a25d9a","line":607,"updated":"2017-03-21 22:23:06.000000000","message":"ditto","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8e234d4f9e3089f1fa3727cc00e16d7063980a16","unresolved":false,"context_lines":[{"line_number":604,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"},{"line_number":605,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":606,"context_line":"        else:"},{"line_number":607,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s \u0027"},{"line_number":608,"context_line":"                          \u0027when attempting to rescue, expected RESCUE or \u0027"},{"line_number":609,"context_line":"                          \u0027RESCUEWAIT.\u0027),"},{"line_number":610,"context_line":"                      {\u0027node\u0027: task.node.uuid, \u0027state\u0027: next_state})"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_c998086d","line":607,"in_reply_to":"1a1ced50_43a25d9a","updated":"2017-03-22 17:57:07.000000000","message":"see above","commit_id":"ccba9e5389d2c3dfe3e4edb44f73e1397591f57f"},{"author":{"_account_id":19686,"name":"Ramamani Yeleswarapu","email":"ramamani.yeleswarapu@intel.com","username":"Rama_Y"},"change_message_id":"9c7bbcf59a6c5f228fe67b68c5390b4fad13bb97","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            del instance_info[\u0027rescue_password\u0027]"},{"line_number":523,"context_line":"            task.node.instance_info \u003d instance_info"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    @METRICS.timer(\u0027ConductorManager.do_node_deploy\u0027)"},{"line_number":526,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"},{"line_number":527,"context_line":"                                   exception.NodeLocked,"},{"line_number":528,"context_line":"                                   exception.InstanceRescueFailure,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_1bb41433","line":525,"range":{"start_line":525,"start_character":37,"end_line":525,"end_character":51},"updated":"2017-03-22 23:24:58.000000000","message":"s/do_node_deploy/do_node_rescue/","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            del instance_info[\u0027rescue_password\u0027]"},{"line_number":523,"context_line":"            task.node.instance_info \u003d instance_info"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    @METRICS.timer(\u0027ConductorManager.do_node_deploy\u0027)"},{"line_number":526,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"},{"line_number":527,"context_line":"                                   exception.NodeLocked,"},{"line_number":528,"context_line":"                                   exception.InstanceRescueFailure,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_222cbf97","line":525,"range":{"start_line":525,"start_character":37,"end_line":525,"end_character":51},"in_reply_to":"1a1ced50_1bb41433","updated":"2017-03-27 15:25:30.000000000","message":"Done","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":19686,"name":"Ramamani Yeleswarapu","email":"ramamani.yeleswarapu@intel.com","username":"Rama_Y"},"change_message_id":"9c7bbcf59a6c5f228fe67b68c5390b4fad13bb97","unresolved":false,"context_lines":[{"line_number":544,"context_line":"                 or allowed."},{"line_number":545,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":546,"context_line":"                 async task."},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"        \"\"\""},{"line_number":549,"context_line":"        LOG.debug(\"RPC do_node_rescue called for node %s.\", node_id)"},{"line_number":550,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_a043d111","line":547,"updated":"2017-03-22 23:24:58.000000000","message":"Missing here - :raises: NodeLocked","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":544,"context_line":"                 or allowed."},{"line_number":545,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":546,"context_line":"                 async task."},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"        \"\"\""},{"line_number":549,"context_line":"        LOG.debug(\"RPC do_node_rescue called for node %s.\", node_id)"},{"line_number":550,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_e225b7ac","line":547,"in_reply_to":"1a1ced50_a043d111","updated":"2017-03-27 15:25:30.000000000","message":"Done","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"dbeefba54f09e2cf00cf860b09bd04e7a3c36801","unresolved":false,"context_lines":[{"line_number":596,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":597,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"},{"line_number":598,"context_line":"                self._remove_node_rescue_password(task)"},{"line_number":599,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":600,"context_line":"                # Don\u0027t rescue a broken node."},{"line_number":601,"context_line":"                return"},{"line_number":602,"context_line":"        if next_state \u003d\u003d states.RESCUEWAIT:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_239fca51","line":599,"range":{"start_line":599,"start_character":16,"end_line":599,"end_character":42},"updated":"2017-03-23 15:51:22.000000000","message":"Need to save node\ntask.node.save()","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":596,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":597,"context_line":"                task.node.last_error \u003d _(\"Failed to rescue. Error: %s\") % e"},{"line_number":598,"context_line":"                self._remove_node_rescue_password(task)"},{"line_number":599,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":600,"context_line":"                # Don\u0027t rescue a broken node."},{"line_number":601,"context_line":"                return"},{"line_number":602,"context_line":"        if next_state \u003d\u003d states.RESCUEWAIT:"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_62ef67b0","line":599,"range":{"start_line":599,"start_character":16,"end_line":599,"end_character":42},"in_reply_to":"1a1ced50_239fca51","updated":"2017-03-27 15:25:30.000000000","message":"process_event handles it, see L614 below","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"dbeefba54f09e2cf00cf860b09bd04e7a3c36801","unresolved":false,"context_lines":[{"line_number":611,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":612,"context_line":"                                     \"state: %s\") % next_state"},{"line_number":613,"context_line":"            self._remove_node_rescue_password(task)"},{"line_number":614,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"},{"line_number":617,"context_line":"                                   exception.NodeLocked,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_c3e516dd","line":614,"range":{"start_line":614,"start_character":12,"end_line":614,"end_character":38},"updated":"2017-03-23 15:51:22.000000000","message":"Need to save node\ntask.node.save()","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":611,"context_line":"            task.node.last_error \u003d _(\"Failed to rescue. Driver returned \""},{"line_number":612,"context_line":"                                     \"state: %s\") % next_state"},{"line_number":613,"context_line":"            self._remove_node_rescue_password(task)"},{"line_number":614,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"},{"line_number":617,"context_line":"                                   exception.NodeLocked,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_c42520ad","line":614,"range":{"start_line":614,"start_character":12,"end_line":614,"end_character":38},"in_reply_to":"1a1ced50_c3e516dd","updated":"2017-03-27 15:25:30.000000000","message":"Maybe I should put a try/except with InvalidState here and save the node only in that case. This should only happen if the driver has incorrect behavior, anyway.\n\nThis save is done via process_event here: https://github.com/openstack/ironic/blob/8aec5fb6a579e1471265beb044fde92755d6e5a1/ironic/conductor/task_manager.py#L481\n\nIf I added a save here, it would the current provision_state of the node instead of the fail state, then the fail state (2 DB writes).\n\nYou can see the pattern of using process_event for saving in other places in this module, like here: https://github.com/openstack/ironic/blob/8aec5fb6a579e1471265beb044fde92755d6e5a1/ironic/conductor/manager.py#L1403\n\nAlthough, I guess skipping that save is theoretically possible if the node is in a state without a fail transition (in which case InvalidState would be raised). This would be a really weird driver error, though.\n\nDeploys handle it this way: https://github.com/openstack/ironic/blob/8aec5fb6a579e1471265beb044fde92755d6e5a1/ironic/conductor/manager.py#L599\n\nMaybe we should do something similar? Although, I don\u0027t see how the node gets saved with that error in that case, either.....","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":19686,"name":"Ramamani Yeleswarapu","email":"ramamani.yeleswarapu@intel.com","username":"Rama_Y"},"change_message_id":"9c7bbcf59a6c5f228fe67b68c5390b4fad13bb97","unresolved":false,"context_lines":[{"line_number":631,"context_line":"                 or allowed."},{"line_number":632,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":633,"context_line":"                 async task"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"        \"\"\""},{"line_number":636,"context_line":"        LOG.debug(\"RPC do_node_unrescue called for node %s.\", node_id)"},{"line_number":637,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_207c41b4","line":634,"updated":"2017-03-22 23:24:58.000000000","message":"ditto","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":631,"context_line":"                 or allowed."},{"line_number":632,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":633,"context_line":"                 async task"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"        \"\"\""},{"line_number":636,"context_line":"        LOG.debug(\"RPC do_node_unrescue called for node %s.\", node_id)"},{"line_number":637,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_227a7f87","line":634,"in_reply_to":"1a1ced50_207c41b4","updated":"2017-03-27 15:25:30.000000000","message":"Done","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"dbeefba54f09e2cf00cf860b09bd04e7a3c36801","unresolved":false,"context_lines":[{"line_number":668,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":669,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":670,"context_line":"                node.last_error \u003d _(\"Failed to unrescue. Error: %s\") % e"},{"line_number":671,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":672,"context_line":"                # Don\u0027t unrescue a broken node."},{"line_number":673,"context_line":"                return"},{"line_number":674,"context_line":"        if next_state \u003d\u003d states.ACTIVE:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_83295ef5","line":671,"range":{"start_line":671,"start_character":16,"end_line":671,"end_character":42},"updated":"2017-03-23 15:51:22.000000000","message":"Need to save node\ntask.node.save()","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":668,"context_line":"                                  \u0027%(err)s\u0027),"},{"line_number":669,"context_line":"                              {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":670,"context_line":"                node.last_error \u003d _(\"Failed to unrescue. Error: %s\") % e"},{"line_number":671,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":672,"context_line":"                # Don\u0027t unrescue a broken node."},{"line_number":673,"context_line":"                return"},{"line_number":674,"context_line":"        if next_state \u003d\u003d states.ACTIVE:"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_0451c80e","line":671,"range":{"start_line":671,"start_character":16,"end_line":671,"end_character":42},"in_reply_to":"1a1ced50_83295ef5","updated":"2017-03-27 15:25:30.000000000","message":"see L614","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"dbeefba54f09e2cf00cf860b09bd04e7a3c36801","unresolved":false,"context_lines":[{"line_number":673,"context_line":"                return"},{"line_number":674,"context_line":"        if next_state \u003d\u003d states.ACTIVE:"},{"line_number":675,"context_line":"            # Remove rescue password on unrescue success"},{"line_number":676,"context_line":"            self._remove_node_rescue_password(task)"},{"line_number":677,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":678,"context_line":"        else:"},{"line_number":679,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_631c62c2","line":676,"range":{"start_line":676,"start_character":12,"end_line":676,"end_character":51},"updated":"2017-03-23 15:51:22.000000000","message":"Need to save node\ntask.node.save()","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":673,"context_line":"                return"},{"line_number":674,"context_line":"        if next_state \u003d\u003d states.ACTIVE:"},{"line_number":675,"context_line":"            # Remove rescue password on unrescue success"},{"line_number":676,"context_line":"            self._remove_node_rescue_password(task)"},{"line_number":677,"context_line":"            task.process_event(\u0027done\u0027)"},{"line_number":678,"context_line":"        else:"},{"line_number":679,"context_line":"            LOG.error(_LE(\u0027Driver returned %(state)s state for node %(node)s, \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_a441fc3b","line":676,"range":{"start_line":676,"start_character":12,"end_line":676,"end_character":51},"in_reply_to":"1a1ced50_631c62c2","updated":"2017-03-27 15:25:30.000000000","message":"see L614 - definitely not needed here since we know the state of the node","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"dbeefba54f09e2cf00cf860b09bd04e7a3c36801","unresolved":false,"context_lines":[{"line_number":681,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":682,"context_line":"            node.last_error \u003d _(\"Failed to unrescue. Driver returned \""},{"line_number":683,"context_line":"                                \"state: %s\") % next_state"},{"line_number":684,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"},{"line_number":687,"context_line":"                                   exception.NodeLocked,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_43768607","line":684,"range":{"start_line":684,"start_character":12,"end_line":684,"end_character":38},"updated":"2017-03-23 15:51:22.000000000","message":"Need to save node\ntask.node.save()","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":681,"context_line":"                      {\u0027node\u0027: node, \u0027state\u0027: next_state})"},{"line_number":682,"context_line":"            node.last_error \u003d _(\"Failed to unrescue. Driver returned \""},{"line_number":683,"context_line":"                                \"state: %s\") % next_state"},{"line_number":684,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"    @messaging.expected_exceptions(exception.NoFreeConductorWorker,"},{"line_number":687,"context_line":"                                   exception.NodeLocked,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_843cb8bf","line":684,"range":{"start_line":684,"start_character":12,"end_line":684,"end_character":38},"in_reply_to":"1a1ced50_43768607","updated":"2017-03-27 15:25:30.000000000","message":"see L614","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5894d98095f253ebaf87993aaa09f2229167cd8a","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                fail_interface \u003d \u0027power\u0027"},{"line_number":563,"context_line":"                task.driver.power.validate(task)"},{"line_number":564,"context_line":"                fail_interface \u003d \u0027rescue\u0027"},{"line_number":565,"context_line":"                task.driver.rescue.validate(task)"},{"line_number":566,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":567,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":568,"context_line":"                self._remove_node_rescue_password(task)"}],"source_content_type":"text/x-python","patch_set":37,"id":"dfeb2761_f792164b","line":565,"range":{"start_line":565,"start_character":16,"end_line":565,"end_character":43},"updated":"2017-04-04 10:48:40.000000000","message":"rescue.validate needs to be added to base.py:RescueInterface()","commit_id":"6806ebed2f87f4c36db7bfc891adb1df19dccff1"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7c65c6a2397fa537fec91797fd8cbbff97913de7","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                fail_interface \u003d \u0027power\u0027"},{"line_number":563,"context_line":"                task.driver.power.validate(task)"},{"line_number":564,"context_line":"                fail_interface \u003d \u0027rescue\u0027"},{"line_number":565,"context_line":"                task.driver.rescue.validate(task)"},{"line_number":566,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":567,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":568,"context_line":"                self._remove_node_rescue_password(task)"}],"source_content_type":"text/x-python","patch_set":37,"id":"bff0334d_552031f7","line":565,"range":{"start_line":565,"start_character":16,"end_line":565,"end_character":43},"in_reply_to":"bff0334d_fd4f3968","updated":"2017-04-12 05:52:41.000000000","message":"Oh, yes. My bad.","commit_id":"6806ebed2f87f4c36db7bfc891adb1df19dccff1"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"04084a8aa1a491b15582a966cb697c600b0ba92f","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                fail_interface \u003d \u0027power\u0027"},{"line_number":563,"context_line":"                task.driver.power.validate(task)"},{"line_number":564,"context_line":"                fail_interface \u003d \u0027rescue\u0027"},{"line_number":565,"context_line":"                task.driver.rescue.validate(task)"},{"line_number":566,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":567,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":568,"context_line":"                self._remove_node_rescue_password(task)"}],"source_content_type":"text/x-python","patch_set":37,"id":"bff0334d_fd4f3968","line":565,"range":{"start_line":565,"start_character":16,"end_line":565,"end_character":43},"in_reply_to":"dfeb2761_f792164b","updated":"2017-04-11 21:13:18.000000000","message":"validate is in BaseInterface, which RescueInterface inherits from","commit_id":"6806ebed2f87f4c36db7bfc891adb1df19dccff1"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ecfbf97b5c89dd20e3c0517ae4d03047a9f7f87a","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        with task_manager.acquire(context, node_id,"},{"line_number":643,"context_line":"                                  purpose\u003d\u0027node unrescue\u0027) as task:"},{"line_number":644,"context_line":"            try:"},{"line_number":645,"context_line":"                task.driver.power.validate(task)"},{"line_number":646,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":647,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":648,"context_line":"                raise exception.InstanceUnrescueFailure("}],"source_content_type":"text/x-python","patch_set":39,"id":"bff0334d_7030ca56","line":645,"updated":"2017-04-12 17:26:38.000000000","message":"don\u0027t we need to validate the management interface too?","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"bbda48af85f136be9004a041c8d4013cb36ba3ee","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        with task_manager.acquire(context, node_id,"},{"line_number":643,"context_line":"                                  purpose\u003d\u0027node unrescue\u0027) as task:"},{"line_number":644,"context_line":"            try:"},{"line_number":645,"context_line":"                task.driver.power.validate(task)"},{"line_number":646,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":647,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":648,"context_line":"                raise exception.InstanceUnrescueFailure("}],"source_content_type":"text/x-python","patch_set":39,"id":"1f013ff3_291976d6","line":645,"in_reply_to":"bff0334d_7030ca56","updated":"2017-05-17 11:02:34.000000000","message":"As I understand, we are not doing any management related task as part of unrescue. Why do you think we need to validate management interface?","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"d8e3d0e27052e6a0ba173661954b64b84d92e208","unresolved":false,"context_lines":[{"line_number":601,"context_line":"                self._remove_node_rescue_password(task)"},{"line_number":602,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":603,"context_line":"                # Don\u0027t rescue a broken node."},{"line_number":604,"context_line":"                return"},{"line_number":605,"context_line":"        if next_state \u003d\u003d states.RESCUEWAIT:"},{"line_number":606,"context_line":"            task.process_event(\u0027wait\u0027)"},{"line_number":607,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"}],"source_content_type":"text/x-python","patch_set":50,"id":"3f1d235d_b90c73ec","line":604,"range":{"start_line":604,"start_character":16,"end_line":604,"end_character":22},"updated":"2017-07-04 14:17:12.000000000","message":"Is this return necessary?","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"87637f5000a5334e692e644331f7386e5f1c2639","unresolved":false,"context_lines":[{"line_number":601,"context_line":"                self._remove_node_rescue_password(task)"},{"line_number":602,"context_line":"                task.process_event(\u0027fail\u0027)"},{"line_number":603,"context_line":"                # Don\u0027t rescue a broken node."},{"line_number":604,"context_line":"                return"},{"line_number":605,"context_line":"        if next_state \u003d\u003d states.RESCUEWAIT:"},{"line_number":606,"context_line":"            task.process_event(\u0027wait\u0027)"},{"line_number":607,"context_line":"        elif next_state \u003d\u003d states.RESCUE:"}],"source_content_type":"text/x-python","patch_set":50,"id":"1f1a1f67_c96697ee","line":604,"range":{"start_line":604,"start_character":16,"end_line":604,"end_character":22},"in_reply_to":"3f1d235d_b90c73ec","updated":"2017-07-13 10:39:56.000000000","message":"yes, the rescue operation has failed so we don\u0027t need to proceed the next steps.","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"c5f3fd60f3e44e165ffc578eaf973199164ab705","unresolved":false,"context_lines":[{"line_number":572,"context_line":"            task.node.save()"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"            try:"},{"line_number":575,"context_line":"                fail_interface \u003d \u0027power\u0027"},{"line_number":576,"context_line":"                task.driver.power.validate(task)"},{"line_number":577,"context_line":"                fail_interface \u003d \u0027rescue\u0027"},{"line_number":578,"context_line":"                task.driver.rescue.validate(task)"}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_4231450b","line":575,"range":{"start_line":575,"start_character":16,"end_line":575,"end_character":40},"updated":"2017-09-25 08:30:25.000000000","message":"what does it used for?","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8bcc0867d5f005065b09d0e8383e29dfa5d93135","unresolved":false,"context_lines":[{"line_number":572,"context_line":"            task.node.save()"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"            try:"},{"line_number":575,"context_line":"                fail_interface \u003d \u0027power\u0027"},{"line_number":576,"context_line":"                task.driver.power.validate(task)"},{"line_number":577,"context_line":"                fail_interface \u003d \u0027rescue\u0027"},{"line_number":578,"context_line":"                task.driver.rescue.validate(task)"}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_781bd41a","line":575,"range":{"start_line":575,"start_character":16,"end_line":575,"end_character":40},"in_reply_to":"7f515b1d_4231450b","updated":"2017-09-27 16:27:36.000000000","message":"Done","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":1774,"context_line":"            for iface_name in task.driver.non_vendor_interfaces:"},{"line_number":1775,"context_line":"                # TODO(stendulker): Remove this check in \u0027rescue\u0027 API patch"},{"line_number":1776,"context_line":"                # Do not have to return the validation result for \u0027rescue\u0027"},{"line_number":1777,"context_line":"                # interface."},{"line_number":1778,"context_line":"                iface \u003d getattr(task.driver, iface_name, None)"},{"line_number":1779,"context_line":"                result \u003d reason \u003d None"},{"line_number":1780,"context_line":"                if iface:"}],"source_content_type":"text/x-python","patch_set":67,"id":"ff82abbf_8c125d61","line":1777,"updated":"2017-11-28 23:09:45.000000000","message":"I think you want to remove this comment too :)","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":1774,"context_line":"            for iface_name in task.driver.non_vendor_interfaces:"},{"line_number":1775,"context_line":"                # TODO(stendulker): Remove this check in \u0027rescue\u0027 API patch"},{"line_number":1776,"context_line":"                # Do not have to return the validation result for \u0027rescue\u0027"},{"line_number":1777,"context_line":"                # interface."},{"line_number":1778,"context_line":"                iface \u003d getattr(task.driver, iface_name, None)"},{"line_number":1779,"context_line":"                result \u003d reason \u003d None"},{"line_number":1780,"context_line":"                if iface:"}],"source_content_type":"text/x-python","patch_set":67,"id":"df87a7cf_499f2350","line":1777,"in_reply_to":"ff82abbf_8c125d61","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"fd18667182cef5a5492adbe46d9f557bb21ae77e","unresolved":false,"context_lines":[{"line_number":895,"context_line":"        \"\"\"Signal to conductor service to perform a rescue."},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"        :param context: request context."},{"line_number":898,"context_line":"        :param node_id: node id or uuid."},{"line_number":899,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":900,"context_line":"        :raises: InstanceRescueFailure"},{"line_number":901,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_baa511a3","line":898,"updated":"2017-01-04 20:44:21.000000000","message":"need docstring for rescue_password param","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"e0415c163aaef403561e27091c87e434312b9619","unresolved":false,"context_lines":[{"line_number":895,"context_line":"        \"\"\"Signal to conductor service to perform a rescue."},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"        :param context: request context."},{"line_number":898,"context_line":"        :param node_id: node id or uuid."},{"line_number":899,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":900,"context_line":"        :raises: InstanceRescueFailure"},{"line_number":901,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_873f1586","line":898,"in_reply_to":"ba5201f7_baa511a3","updated":"2017-01-04 23:01:29.000000000","message":"Done","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"243fcd8a08742092a07498236f941b5553c38ed0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    |    1.39 - Added timeout optional parameter to change_node_power_state"},{"line_number":91,"context_line":"    |    1.40 - Added inject_nmi"},{"line_number":92,"context_line":"    |    1.41 - Added create_port"},{"line_number":93,"context_line":"    |    1.42 - Added do_node_rescue and do_node_unrescue"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_c1c44643","line":93,"updated":"2017-09-21 03:45:21.000000000","message":"nit: We also have can_send_rescue defined in this patch now. A follow-up would be good.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e22de292978bc29bb4ea87d9c45bef76c839b296","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    |    1.39 - Added timeout optional parameter to change_node_power_state"},{"line_number":91,"context_line":"    |    1.40 - Added inject_nmi"},{"line_number":92,"context_line":"    |    1.41 - Added create_port"},{"line_number":93,"context_line":"    |    1.42 - Added do_node_rescue and do_node_unrescue"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_26745399","line":93,"in_reply_to":"9f5c4f37_c1c44643","updated":"2017-09-21 05:38:31.000000000","message":"Done","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"}],"ironic/drivers/base.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    rescue \u003d None"},{"line_number":84,"context_line":"    # NOTE(deva): hide rescue from the interface list in Icehouse"},{"line_number":85,"context_line":"    #             because the API for this has not been created yet."},{"line_number":86,"context_line":"    standard_interfaces.append(\u0027rescue\u0027)"},{"line_number":87,"context_line":"    \"\"\"`Standard` attribute for accessing rescue features."}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_1d7585ca","line":84,"updated":"2016-11-15 18:34:14.000000000","message":"Please remove this comment","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    rescue \u003d None"},{"line_number":84,"context_line":"    # NOTE(deva): hide rescue from the interface list in Icehouse"},{"line_number":85,"context_line":"    #             because the API for this has not been created yet."},{"line_number":86,"context_line":"    standard_interfaces.append(\u0027rescue\u0027)"},{"line_number":87,"context_line":"    \"\"\"`Standard` attribute for accessing rescue features."}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_32e644e8","line":84,"in_reply_to":"7a77a97e_1d7585ca","updated":"2016-11-18 22:51:31.000000000","message":"Done","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"05ea675974d6c3f131147fe4955ff649fa8da060","unresolved":false,"context_lines":[{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":562,"context_line":"        \"\"\""},{"line_number":563,"context_line":""},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"# Representation of a single vendor method metadata"},{"line_number":566,"context_line":"VendorMetadata \u003d collections.namedtuple(\u0027VendorMetadata\u0027, [\u0027method\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_fa1eb9b9","line":563,"updated":"2017-01-04 20:47:39.000000000","message":"There should be an abstractmethod for validate(self, task) here","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"e0415c163aaef403561e27091c87e434312b9619","unresolved":false,"context_lines":[{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":562,"context_line":"        \"\"\""},{"line_number":563,"context_line":""},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"# Representation of a single vendor method metadata"},{"line_number":566,"context_line":"VendorMetadata \u003d collections.namedtuple(\u0027VendorMetadata\u0027, [\u0027method\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_dd53ac69","line":563,"in_reply_to":"ba5201f7_fa1eb9b9","updated":"2017-01-04 23:01:29.000000000","message":"Done","commit_id":"ac40f3ce17f0ba543552272e94d340801a8afd4b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2fea75de3cb043375e5954a395563dd75b724bac","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    rescue \u003d None"},{"line_number":86,"context_line":"    # NOTE(deva): hide rescue from the interface list in Icehouse"},{"line_number":87,"context_line":"    #             because the API for this has not been created yet."},{"line_number":88,"context_line":"    # standard_interfaces.append(\u0027rescue\u0027)"},{"line_number":89,"context_line":"    \"\"\"`Standard` attribute for accessing rescue features."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_eab61589","side":"PARENT","line":87,"updated":"2017-03-08 11:35:01.000000000","message":"heh wow that\u0027s old :-)","commit_id":"fec55f4a113591a6ff725f66d8ec36b89a033e61"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":575,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":576,"context_line":"        \"\"\""},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"    @abc.abstractmethod"},{"line_number":579,"context_line":"    def validate(self, task):"},{"line_number":580,"context_line":"        \"\"\"Validates the rescue interface."},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        :param task: a TaskManager instance."}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_3127a2b7","line":579,"range":{"start_line":578,"start_character":0,"end_line":579,"end_character":29},"updated":"2017-03-09 05:38:10.000000000","message":"This is not required here as its avaiable through BaseInterface()","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":575,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":576,"context_line":"        \"\"\""},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"    @abc.abstractmethod"},{"line_number":579,"context_line":"    def validate(self, task):"},{"line_number":580,"context_line":"        \"\"\"Validates the rescue interface."},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        :param task: a TaskManager instance."}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_627da1b0","line":579,"range":{"start_line":578,"start_character":0,"end_line":579,"end_character":29},"in_reply_to":"9a30ddce_3127a2b7","updated":"2017-03-21 19:16:54.000000000","message":"Nice catch, removed.","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"}],"ironic/drivers/modules/fake.py":[{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class FakeRescue(base.RescueInterface):"},{"line_number":198,"context_line":"    \"\"\"Example implementation of a simple console interface.\"\"\""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def get_properties(self):"},{"line_number":201,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_7e04c614","line":198,"updated":"2017-01-19 21:52:22.000000000","message":"console/rescue","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class FakeRescue(base.RescueInterface):"},{"line_number":198,"context_line":"    \"\"\"Example implementation of a simple console interface.\"\"\""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def get_properties(self):"},{"line_number":201,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_ab24fcae","line":198,"in_reply_to":"5a3905b3_7e04c614","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    def validate(self, task):"},{"line_number":201,"context_line":"        pass"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def rescue(self, task, password):"},{"line_number":204,"context_line":"        pass"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def unrescue(self, task):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_91804e48","line":203,"range":{"start_line":203,"start_character":25,"end_line":203,"end_character":37},"updated":"2017-03-09 05:38:10.000000000","message":"nit: There should not be any \u0027password\u0027 arg","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    def validate(self, task):"},{"line_number":201,"context_line":"        pass"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def rescue(self, task, password):"},{"line_number":204,"context_line":"        pass"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def unrescue(self, task):"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_02286d99","line":203,"range":{"start_line":203,"start_character":25,"end_line":203,"end_character":37},"in_reply_to":"9a30ddce_91804e48","updated":"2017-03-21 19:16:54.000000000","message":"Removed","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"dbeefba54f09e2cf00cf860b09bd04e7a3c36801","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        return {}"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def validate(self, task):"},{"line_number":201,"context_line":"        pass"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def rescue(self, task):"},{"line_number":204,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a1ced50_86ba4c70","line":201,"range":{"start_line":201,"start_character":8,"end_line":201,"end_character":12},"updated":"2017-03-23 15:51:22.000000000","message":"Though node.instance_info[\u0027rescue_password\u0027] will not be used in Fake driver, it would be better to validate node.instance_info[\u0027rescue_password\u0027] here for completeness.\nWDYT?","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5709774275d8b69ff5b50cb87d82feda7944c18a","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        return {}"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def validate(self, task):"},{"line_number":201,"context_line":"        pass"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def rescue(self, task):"},{"line_number":204,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_c487600f","line":201,"range":{"start_line":201,"start_character":8,"end_line":201,"end_character":12},"in_reply_to":"1a1ced50_86ba4c70","updated":"2017-03-27 15:25:30.000000000","message":"I don\u0027t think this would be valuable, since it\u0027s the decision of the driver whether they care to validate rescue_password. We should have a test that rescue fails when validate() fails though, I\u0027ll add one for that.","commit_id":"c9cceb8874a00f0beb032e04f16344913632b446"}],"ironic/objects/node.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"8c73067fd752f49b50437fef6291f94f0dfdaafc","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        \u0027target_provision_state\u0027: (\u0027node\u0027, \u0027target_provision_state\u0027),"},{"line_number":462,"context_line":"        \u0027updated_at\u0027: (\u0027node\u0027, \u0027updated_at\u0027),"},{"line_number":463,"context_line":"        \u0027uuid\u0027: (\u0027node\u0027, \u0027uuid\u0027)"},{"line_number":464,"context_line":"    }"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    # Version 1.0: Initial version, based off of Node version 1.18."},{"line_number":467,"context_line":"    # Version 1.1: Type of network_interface changed to just nullable string"}],"source_content_type":"text/x-python","patch_set":55,"id":"7f287b81_4a8689bb","line":464,"updated":"2017-09-08 08:43:33.000000000","message":"We need to add rescue_interface to notification. Another patch would be better not to enlarge this patch.","commit_id":"8a0b03656b4ad30916efb14dd28e0df296ede593"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"68cbf78e6194993a3508372f5961541bf316be15","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        \u0027target_provision_state\u0027: (\u0027node\u0027, \u0027target_provision_state\u0027),"},{"line_number":462,"context_line":"        \u0027updated_at\u0027: (\u0027node\u0027, \u0027updated_at\u0027),"},{"line_number":463,"context_line":"        \u0027uuid\u0027: (\u0027node\u0027, \u0027uuid\u0027)"},{"line_number":464,"context_line":"    }"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    # Version 1.0: Initial version, based off of Node version 1.18."},{"line_number":467,"context_line":"    # Version 1.1: Type of network_interface changed to just nullable string"}],"source_content_type":"text/x-python","patch_set":55,"id":"5f2577a7_2e73e8e9","line":464,"in_reply_to":"7f287b81_4a8689bb","updated":"2017-09-12 04:34:06.000000000","message":"Will push another patch for covering notifications.","commit_id":"8a0b03656b4ad30916efb14dd28e0df296ede593"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"c5f3fd60f3e44e165ffc578eaf973199164ab705","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        \u0027network_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":125,"context_line":"        \u0027power_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":126,"context_line":"        \u0027raid_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":127,"context_line":"        \u0027rescue_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027storage_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":129,"context_line":"        \u0027vendor_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":130,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_bf2496c7","line":127,"range":{"start_line":127,"start_character":9,"end_line":127,"end_character":25},"updated":"2017-09-25 08:30:25.000000000","message":"we also need to add the new field to CRUD payload, and bump the version.","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8bcc0867d5f005065b09d0e8383e29dfa5d93135","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        \u0027network_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":125,"context_line":"        \u0027power_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":126,"context_line":"        \u0027raid_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":127,"context_line":"        \u0027rescue_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027storage_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":129,"context_line":"        \u0027vendor_interface\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":130,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":57,"id":"7f515b1d_d8d08853","line":127,"range":{"start_line":127,"start_character":9,"end_line":127,"end_character":25},"in_reply_to":"7f515b1d_bf2496c7","updated":"2017-09-27 16:27:36.000000000","message":"Done","commit_id":"ab155817f83cc6ba096c40749faaa3cc5f7add49"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"70024ca3782b11bf402b7876cbaee0be52898966","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        \u0027network_interface\u0027: (\u0027node\u0027, \u0027network_interface\u0027),"},{"line_number":451,"context_line":"        \u0027power_interface\u0027: (\u0027node\u0027, \u0027power_interface\u0027),"},{"line_number":452,"context_line":"        \u0027raid_interface\u0027: (\u0027node\u0027, \u0027raid_interface\u0027),"},{"line_number":453,"context_line":"        \u0027rescue_interface\u0027: (\u0027node\u0027, \u0027rescue_interface\u0027),"},{"line_number":454,"context_line":"        \u0027storage_interface\u0027: (\u0027node\u0027, \u0027storage_interface\u0027),"},{"line_number":455,"context_line":"        \u0027vendor_interface\u0027: (\u0027node\u0027, \u0027vendor_interface\u0027),"},{"line_number":456,"context_line":"        \u0027power_state\u0027: (\u0027node\u0027, \u0027power_state\u0027),"}],"source_content_type":"text/x-python","patch_set":65,"id":"1f485f77_8013795c","line":453,"updated":"2017-11-15 08:45:30.000000000","message":"I think this notification change should be done in the next patch[1] with other notification changes.\n\n[1] https://review.openstack.org/#/c/502889/","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5c5b7de06b7cd9afc0e0f6db88e0e9f66bbf20d8","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        \u0027network_interface\u0027: (\u0027node\u0027, \u0027network_interface\u0027),"},{"line_number":451,"context_line":"        \u0027power_interface\u0027: (\u0027node\u0027, \u0027power_interface\u0027),"},{"line_number":452,"context_line":"        \u0027raid_interface\u0027: (\u0027node\u0027, \u0027raid_interface\u0027),"},{"line_number":453,"context_line":"        \u0027rescue_interface\u0027: (\u0027node\u0027, \u0027rescue_interface\u0027),"},{"line_number":454,"context_line":"        \u0027storage_interface\u0027: (\u0027node\u0027, \u0027storage_interface\u0027),"},{"line_number":455,"context_line":"        \u0027vendor_interface\u0027: (\u0027node\u0027, \u0027vendor_interface\u0027),"},{"line_number":456,"context_line":"        \u0027power_state\u0027: (\u0027node\u0027, \u0027power_state\u0027),"}],"source_content_type":"text/x-python","patch_set":65,"id":"1f485f77_644e0839","line":453,"in_reply_to":"1f485f77_8013795c","updated":"2017-11-24 14:57:52.000000000","message":"Done","commit_id":"2f5f8e11f47fe73670e28c4b44398479401ff34c"}],"ironic/tests/unit/api/controllers/v1/test_driver.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"243fcd8a08742092a07498236f941b5553c38ed0","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            self.dbapi.register_conductor_hardware_interfaces("},{"line_number":49,"context_line":"                c.id, self.d3, \u0027deploy\u0027, [\u0027iscsi\u0027, \u0027direct\u0027], \u0027direct\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _test_drivers(self, use_dynamic, detail\u003dFalse, rescue_if\u003dFalse):"},{"line_number":52,"context_line":"        self.register_fake_conductors()"},{"line_number":53,"context_line":"        headers \u003d {}"},{"line_number":54,"context_line":"        expected \u003d ["}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_3c8225ca","line":51,"updated":"2017-09-21 03:45:21.000000000","message":"I\u0027m not sure I understand. Why are we replacing storage with rescue? Should we not just add instead?  Granted, it would make the conditional logic on line 62 a little more complex... But still.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e22de292978bc29bb4ea87d9c45bef76c839b296","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            self.dbapi.register_conductor_hardware_interfaces("},{"line_number":49,"context_line":"                c.id, self.d3, \u0027deploy\u0027, [\u0027iscsi\u0027, \u0027direct\u0027], \u0027direct\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _test_drivers(self, use_dynamic, detail\u003dFalse, rescue_if\u003dFalse):"},{"line_number":52,"context_line":"        self.register_fake_conductors()"},{"line_number":53,"context_line":"        headers \u003d {}"},{"line_number":54,"context_line":"        expected \u003d ["}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_86e89f16","line":51,"in_reply_to":"9f5c4f37_3c8225ca","updated":"2017-09-21 05:38:31.000000000","message":"Changed the argument name to \u0027latest_if\u0027 to make it more representative and to reduce the complexity in the testcases.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"243fcd8a08742092a07498236f941b5553c38ed0","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                self.assertIn(\u0027default_deploy_interface\u0027, d)"},{"line_number":90,"context_line":"                if rescue_if:"},{"line_number":91,"context_line":"                    self.assertIn(\u0027default_rescue_interface\u0027, d)"},{"line_number":92,"context_line":"                    self.assertIn(\u0027enabled_rescue_interfaces\u0027, d)"},{"line_number":93,"context_line":"                    self.assertIn(\u0027default_storage_interface\u0027, d)"},{"line_number":94,"context_line":"                    self.assertIn(\u0027enabled_storage_interfaces\u0027, d)"},{"line_number":95,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_fc024d3e","line":92,"updated":"2017-09-21 03:45:21.000000000","message":"Additive makes sense in a way, but I feel it should be added separately. That or rescue_if should maybe be renamed to something more representative of what it is actually doing, comparing latest.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e22de292978bc29bb4ea87d9c45bef76c839b296","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                self.assertIn(\u0027default_deploy_interface\u0027, d)"},{"line_number":90,"context_line":"                if rescue_if:"},{"line_number":91,"context_line":"                    self.assertIn(\u0027default_rescue_interface\u0027, d)"},{"line_number":92,"context_line":"                    self.assertIn(\u0027enabled_rescue_interfaces\u0027, d)"},{"line_number":93,"context_line":"                    self.assertIn(\u0027default_storage_interface\u0027, d)"},{"line_number":94,"context_line":"                    self.assertIn(\u0027enabled_storage_interfaces\u0027, d)"},{"line_number":95,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_c6e5773a","line":92,"in_reply_to":"9f5c4f37_fc024d3e","updated":"2017-09-21 05:38:31.000000000","message":"Changed the argument name to \u0027latest_if\u0027 to make it more representative.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"243fcd8a08742092a07498236f941b5553c38ed0","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        self._test_drivers_with_dynamic_detailed()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_drivers_with_dynamic_detailed_storage_interface(self):"},{"line_number":135,"context_line":"        self._test_drivers_with_dynamic_detailed(rescue_if\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _test_drivers_type_filter(self, requested_type):"},{"line_number":138,"context_line":"        self.register_fake_conductors()"}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_1c04017b","line":135,"range":{"start_line":135,"start_character":49,"end_line":135,"end_character":55},"updated":"2017-09-21 03:45:21.000000000","message":"I think this was unintended? Seems like the test should still do what is intended, not the rescue interface?","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e22de292978bc29bb4ea87d9c45bef76c839b296","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        self._test_drivers_with_dynamic_detailed()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_drivers_with_dynamic_detailed_storage_interface(self):"},{"line_number":135,"context_line":"        self._test_drivers_with_dynamic_detailed(rescue_if\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _test_drivers_type_filter(self, requested_type):"},{"line_number":138,"context_line":"        self.register_fake_conductors()"}],"source_content_type":"text/x-python","patch_set":56,"id":"9f5c4f37_86d1bf5a","line":135,"range":{"start_line":135,"start_character":49,"end_line":135,"end_character":55},"in_reply_to":"9f5c4f37_1c04017b","updated":"2017-09-21 05:38:31.000000000","message":"Changed the argument name to \u0027latest_if\u0027 to make it more representative.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        expected \u003d sorted(expected, key\u003dlambda d: d[\u0027name\u0027])"},{"line_number":60,"context_line":"        if use_dynamic:"},{"line_number":61,"context_line":"            if latest_if:"},{"line_number":62,"context_line":"                headers[api_base.Version.string] \u003d \u00271.37\u0027"},{"line_number":63,"context_line":"            else:"},{"line_number":64,"context_line":"                headers[api_base.Version.string] \u003d \u00271.30\u0027"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_94454c1a","line":62,"updated":"2018-01-25 03:29:53.000000000","message":"s/37/38/","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        expected \u003d sorted(expected, key\u003dlambda d: d[\u0027name\u0027])"},{"line_number":60,"context_line":"        if use_dynamic:"},{"line_number":61,"context_line":"            if latest_if:"},{"line_number":62,"context_line":"                headers[api_base.Version.string] \u003d \u00271.37\u0027"},{"line_number":63,"context_line":"            else:"},{"line_number":64,"context_line":"                headers[api_base.Version.string] \u003d \u00271.30\u0027"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_9a4c9377","line":62,"in_reply_to":"5f93b717_94454c1a","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15eed28a31af5c00fafbb50f9231183c8481c069","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        expected \u003d sorted(expected, key\u003dlambda d: d[\u0027name\u0027])"},{"line_number":60,"context_line":"        if use_dynamic:"},{"line_number":61,"context_line":"            if latest_if:"},{"line_number":62,"context_line":"                headers[api_base.Version.string] \u003d \u00271.38\u0027"},{"line_number":63,"context_line":"            else:"},{"line_number":64,"context_line":"                headers[api_base.Version.string] \u003d \u00271.30\u0027"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_5b2effa5","line":62,"updated":"2018-01-25 16:17:04.000000000","message":"as a follow up, we should just use api.controllers/v1.versions._MAX_VERSION_STRING\n\ncuz who is going to continue to update this value?","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7adad4dba4cf7f5428ce577b2565e0684f673136","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        expected \u003d sorted(expected, key\u003dlambda d: d[\u0027name\u0027])"},{"line_number":60,"context_line":"        if use_dynamic:"},{"line_number":61,"context_line":"            if latest_if:"},{"line_number":62,"context_line":"                headers[api_base.Version.string] \u003d \u00271.38\u0027"},{"line_number":63,"context_line":"            else:"},{"line_number":64,"context_line":"                headers[api_base.Version.string] \u003d \u00271.30\u0027"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_849c085e","line":62,"in_reply_to":"5f93b717_5b2effa5","updated":"2018-01-27 03:18:04.000000000","message":"Done","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15eed28a31af5c00fafbb50f9231183c8481c069","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        headers \u003d {}"},{"line_number":200,"context_line":"        if latest_if:"},{"line_number":201,"context_line":"            headers[api_base.Version.string] \u003d \u00271.38\u0027"},{"line_number":202,"context_line":"        else:"},{"line_number":203,"context_line":"            headers[api_base.Version.string] \u003d \u00271.30\u0027"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_db13ef65","line":201,"updated":"2018-01-25 16:17:04.000000000","message":"ditto","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7adad4dba4cf7f5428ce577b2565e0684f673136","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        headers \u003d {}"},{"line_number":200,"context_line":"        if latest_if:"},{"line_number":201,"context_line":"            headers[api_base.Version.string] \u003d \u00271.38\u0027"},{"line_number":202,"context_line":"        else:"},{"line_number":203,"context_line":"            headers[api_base.Version.string] \u003d \u00271.30\u0027"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_a4b824c8","line":201,"in_reply_to":"5f93b717_db13ef65","updated":"2018-01-27 03:18:04.000000000","message":"Done","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"}],"ironic/tests/unit/api/controllers/v1/test_node.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":2174,"context_line":"        self.assertEqual(\u0027neutron\u0027, result[\u0027network_interface\u0027])"},{"line_number":2175,"context_line":""},{"line_number":2176,"context_line":"    def test_create_node_specify_interfaces(self):"},{"line_number":2177,"context_line":"        headers \u003d {api_base.Version.string: \u00271.37\u0027}"},{"line_number":2178,"context_line":"        all_interface_fields \u003d api_utils.V31_FIELDS + [\u0027network_interface\u0027,"},{"line_number":2179,"context_line":"                                                       \u0027rescue_interface\u0027,"},{"line_number":2180,"context_line":"                                                       \u0027storage_interface\u0027]"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_f46cd09d","line":2177,"updated":"2018-01-25 03:29:53.000000000","message":"s/37/38","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":2174,"context_line":"        self.assertEqual(\u0027neutron\u0027, result[\u0027network_interface\u0027])"},{"line_number":2175,"context_line":""},{"line_number":2176,"context_line":"    def test_create_node_specify_interfaces(self):"},{"line_number":2177,"context_line":"        headers \u003d {api_base.Version.string: \u00271.37\u0027}"},{"line_number":2178,"context_line":"        all_interface_fields \u003d api_utils.V31_FIELDS + [\u0027network_interface\u0027,"},{"line_number":2179,"context_line":"                                                       \u0027rescue_interface\u0027,"},{"line_number":2180,"context_line":"                                                       \u0027storage_interface\u0027]"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_3aabffd6","line":2177,"in_reply_to":"5f93b717_f46cd09d","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3243,"context_line":"                                         states.VERBS[\u0027provide\u0027],"},{"line_number":3244,"context_line":"                                         \u0027test-topic\u0027)"},{"line_number":3245,"context_line":""},{"line_number":3246,"context_line":"    def test_rescue_raises_error_before_1_37(self):"},{"line_number":3247,"context_line":"        \"\"\"Test that a lower API client cannot use the rescue verb\"\"\""},{"line_number":3248,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3249,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_34f8f8c2","line":3246,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3243,"context_line":"                                         states.VERBS[\u0027provide\u0027],"},{"line_number":3244,"context_line":"                                         \u0027test-topic\u0027)"},{"line_number":3245,"context_line":""},{"line_number":3246,"context_line":"    def test_rescue_raises_error_before_1_37(self):"},{"line_number":3247,"context_line":"        \"\"\"Test that a lower API client cannot use the rescue verb\"\"\""},{"line_number":3248,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3249,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_7a82e751","line":3246,"in_reply_to":"5f93b717_34f8f8c2","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3252,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3253,"context_line":"        self.assertEqual(http_client.NOT_ACCEPTABLE, ret.status_code)"},{"line_number":3254,"context_line":""},{"line_number":3255,"context_line":"    def test_unrescue_raises_error_before_1_37(self):"},{"line_number":3256,"context_line":"        \"\"\"Test that a lower API client cannot use the unrescue verb\"\"\""},{"line_number":3257,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3258,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_f40130b1","line":3255,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3252,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3253,"context_line":"        self.assertEqual(http_client.NOT_ACCEPTABLE, ret.status_code)"},{"line_number":3254,"context_line":""},{"line_number":3255,"context_line":"    def test_unrescue_raises_error_before_1_37(self):"},{"line_number":3256,"context_line":"        \"\"\"Test that a lower API client cannot use the unrescue verb\"\"\""},{"line_number":3257,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3258,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_1a972393","line":3255,"in_reply_to":"5f93b717_f40130b1","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3266,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3267,"context_line":"                            {\u0027target\u0027: states.ACTIVE,"},{"line_number":3268,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3269,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3270,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3271,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3272,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_14fffcaa","line":3269,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3266,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3267,"context_line":"                            {\u0027target\u0027: states.ACTIVE,"},{"line_number":3268,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3269,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3270,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3271,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3272,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_fae2772f","line":3269,"in_reply_to":"5f93b717_14fffcaa","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"        self.node.save()"},{"line_number":3277,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3278,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":3279,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3280,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3281,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3282,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_74276066","line":3279,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"        self.node.save()"},{"line_number":3277,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3278,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":3279,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3280,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3281,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3282,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_7ad0a751","line":3279,"in_reply_to":"5f93b717_74276066","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3287,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3288,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3289,"context_line":"                             \u0027rescue_password\u0027: \u0027      \u0027},"},{"line_number":3290,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3291,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3292,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3293,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_3421d84e","line":3290,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3287,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3288,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3289,"context_line":"                             \u0027rescue_password\u0027: \u0027      \u0027},"},{"line_number":3290,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3291,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3292,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3293,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_1ac5e38e","line":3290,"in_reply_to":"5f93b717_3421d84e","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3298,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3299,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3300,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3301,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3302,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3303,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3304,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_541ee40c","line":3301,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3298,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % self.node.uuid,"},{"line_number":3299,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3300,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3301,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3302,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3303,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3304,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_3ac21f87","line":3301,"in_reply_to":"5f93b717_541ee40c","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3313,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3314,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3315,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3316,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3317,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3318,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3319,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_b4d2c833","line":3316,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3313,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3314,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3315,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3316,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3317,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3318,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3319,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_ba3b8f9a","line":3316,"in_reply_to":"5f93b717_b4d2c833","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3326,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3327,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3328,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3329,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3330,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3331,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3332,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_d4d75423","line":3329,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3326,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3327,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3328,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3329,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3330,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3331,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3332,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_5a404b08","line":3329,"in_reply_to":"5f93b717_d4d75423","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3341,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3342,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3343,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3344,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3345,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3346,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3347,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_74dc4046","line":3344,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3341,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3342,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3343,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3344,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3345,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3346,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3347,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_1a4ac326","line":3344,"in_reply_to":"5f93b717_74dc4046","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3356,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3357,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3358,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3359,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3360,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3361,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3362,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_34e6b818","line":3359,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3356,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3357,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3358,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3359,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3360,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3361,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3362,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_3a477f20","line":3359,"in_reply_to":"5f93b717_34e6b818","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3370,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3371,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3372,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3373,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3374,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3375,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3376,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_54e34406","line":3373,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3370,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3371,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3372,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3373,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3374,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3375,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3376,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_9a5fb3e4","line":3373,"in_reply_to":"5f93b717_54e34406","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3384,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3385,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3386,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3387,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3388,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3389,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3390,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_f4eff0e6","line":3387,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3384,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3385,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":3386,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3387,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3388,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3389,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3390,"context_line":"        self.mock_dnr.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_ba64efba","line":3387,"in_reply_to":"5f93b717_f4eff0e6","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3398,"context_line":"        node.save()"},{"line_number":3399,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3400,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":3401,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3402,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3403,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3404,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_d4c0b453","line":3401,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3398,"context_line":"        node.save()"},{"line_number":3399,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3400,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":3401,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3402,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3403,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3404,"context_line":"        self.assertFalse(self.mock_dnr.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_5a592bfc","line":3401,"in_reply_to":"5f93b717_d4c0b453","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3410,"context_line":"        node.save()"},{"line_number":3411,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3412,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3413,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3414,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3415,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3416,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_94ba2cdc","line":3413,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3410,"context_line":"        node.save()"},{"line_number":3411,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3412,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3413,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3414,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3415,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3416,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_5a27eb65","line":3413,"in_reply_to":"5f93b717_94ba2cdc","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3423,"context_line":"        node.save()"},{"line_number":3424,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3425,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3426,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3427,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3428,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3429,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_34cf9880","line":3426,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3423,"context_line":"        node.save()"},{"line_number":3424,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3425,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3426,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3427,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3428,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3429,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_1a21634e","line":3426,"in_reply_to":"5f93b717_34cf9880","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3435,"context_line":"        node.save()"},{"line_number":3436,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3437,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3438,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3439,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3440,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3441,"context_line":"        self.mock_dnur.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_54cca488","line":3438,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3435,"context_line":"        node.save()"},{"line_number":3436,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3437,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3438,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3439,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3440,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3441,"context_line":"        self.mock_dnur.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_7ae187fe","line":3438,"in_reply_to":"5f93b717_54cca488","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3449,"context_line":"        node.save()"},{"line_number":3450,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3451,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3452,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3453,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3454,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3455,"context_line":"        self.mock_dnur.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_f4c85075","line":3452,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3449,"context_line":"        node.save()"},{"line_number":3450,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3451,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3452,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3453,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3454,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3455,"context_line":"        self.mock_dnur.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_5adccb45","line":3452,"in_reply_to":"5f93b717_f4c85075","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3463,"context_line":"        node.save()"},{"line_number":3464,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3465,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3466,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3467,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3468,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3469,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_b4a088a7","line":3466,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3463,"context_line":"        node.save()"},{"line_number":3464,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3465,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3466,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3467,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3468,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3469,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_daef7be7","line":3466,"in_reply_to":"5f93b717_b4a088a7","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3476,"context_line":"        node.save()"},{"line_number":3477,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3478,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3479,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3480,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3481,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3482,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_149b7c72","line":3479,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3476,"context_line":"        node.save()"},{"line_number":3477,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3478,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3479,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3480,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3481,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3482,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_9abb33e4","line":3479,"in_reply_to":"5f93b717_149b7c72","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3489,"context_line":"        node.save()"},{"line_number":3490,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3491,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3492,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3493,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3494,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3495,"context_line":"        self.mock_dnur.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_347d581c","line":3492,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3489,"context_line":"        node.save()"},{"line_number":3490,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3491,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3492,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"})"},{"line_number":3493,"context_line":"        self.assertEqual(http_client.ACCEPTED, ret.status_code)"},{"line_number":3494,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":3495,"context_line":"        self.mock_dnur.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_bac06f52","line":3492,"in_reply_to":"5f93b717_347d581c","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":3503,"context_line":"        node.save()"},{"line_number":3504,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3505,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3506,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3507,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3508,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3509,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_9488ec1f","line":3506,"updated":"2018-01-25 03:29:53.000000000","message":"ditto","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":3503,"context_line":"        node.save()"},{"line_number":3504,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"},{"line_number":3505,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027unrescue\u0027]},"},{"line_number":3506,"context_line":"                            headers\u003d{api_base.Version.string: \"1.37\"},"},{"line_number":3507,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3508,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3509,"context_line":"        self.assertFalse(self.mock_dnur.called)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_dac8db75","line":3506,"in_reply_to":"5f93b717_9488ec1f","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15eed28a31af5c00fafbb50f9231183c8481c069","unresolved":false,"context_lines":[{"line_number":3352,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3353,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3354,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3355,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3356,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3357,"context_line":""},{"line_number":3358,"context_line":"    def test_provision_rescue_no_password(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_f6d04253","line":3355,"updated":"2018-01-25 16:17:04.000000000","message":"we should check the response, eg self.assertIn(\u0027\"rescue_password\" is only valid\u0027, ret.json[\u0027error_message\u0027])","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7adad4dba4cf7f5428ce577b2565e0684f673136","unresolved":false,"context_lines":[{"line_number":3352,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":3353,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3354,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3355,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3356,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3357,"context_line":""},{"line_number":3358,"context_line":"    def test_provision_rescue_no_password(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_ef4a8553","line":3355,"in_reply_to":"5f93b717_f6d04253","updated":"2018-01-27 03:18:04.000000000","message":"Done","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15eed28a31af5c00fafbb50f9231183c8481c069","unresolved":false,"context_lines":[{"line_number":3362,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":3363,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3364,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3365,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3366,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3367,"context_line":""},{"line_number":3368,"context_line":"    def test_provision_rescue_empty_password(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_b6c2ba84","line":3365,"updated":"2018-01-25 16:17:04.000000000","message":"ditto","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7adad4dba4cf7f5428ce577b2565e0684f673136","unresolved":false,"context_lines":[{"line_number":3362,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":3363,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3364,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3365,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3366,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3367,"context_line":""},{"line_number":3368,"context_line":"    def test_provision_rescue_empty_password(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_2faf0de4","line":3365,"in_reply_to":"5f93b717_b6c2ba84","updated":"2018-01-27 03:18:04.000000000","message":"Done","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15eed28a31af5c00fafbb50f9231183c8481c069","unresolved":false,"context_lines":[{"line_number":3373,"context_line":"                             \u0027rescue_password\u0027: \u0027      \u0027},"},{"line_number":3374,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3375,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3376,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3377,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3378,"context_line":""},{"line_number":3379,"context_line":"    def test_provision_rescue_in_active(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_1637eeb2","line":3376,"updated":"2018-01-25 16:17:04.000000000","message":"ditto","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7adad4dba4cf7f5428ce577b2565e0684f673136","unresolved":false,"context_lines":[{"line_number":3373,"context_line":"                             \u0027rescue_password\u0027: \u0027      \u0027},"},{"line_number":3374,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3375,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3376,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3377,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3378,"context_line":""},{"line_number":3379,"context_line":"    def test_provision_rescue_in_active(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_aa630b1a","line":3376,"in_reply_to":"5f93b717_1637eeb2","updated":"2018-01-27 03:18:04.000000000","message":"Done","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15eed28a31af5c00fafbb50f9231183c8481c069","unresolved":false,"context_lines":[{"line_number":3374,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3375,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3376,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3377,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3378,"context_line":""},{"line_number":3379,"context_line":"    def test_provision_rescue_in_active(self):"},{"line_number":3380,"context_line":"        self.node.provision_state \u003d states.ACTIVE"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_1605aec2","line":3377,"updated":"2018-01-25 16:17:04.000000000","message":"wow, I keep thinking this is \u0027do not resuscitate\u0027","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7adad4dba4cf7f5428ce577b2565e0684f673136","unresolved":false,"context_lines":[{"line_number":3374,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3375,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3376,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":3377,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":3378,"context_line":""},{"line_number":3379,"context_line":"    def test_provision_rescue_in_active(self):"},{"line_number":3380,"context_line":"        self.node.provision_state \u003d states.ACTIVE"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_4a7287e5","line":3377,"in_reply_to":"5f93b717_1605aec2","updated":"2018-01-27 03:18:04.000000000","message":":)","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15eed28a31af5c00fafbb50f9231183c8481c069","unresolved":false,"context_lines":[{"line_number":3590,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3591,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3592,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3593,"context_line":"        self.assertFalse(self.mock_dnur.called)"},{"line_number":3594,"context_line":""},{"line_number":3595,"context_line":"    def test_inspect_already_in_progress(self):"},{"line_number":3596,"context_line":"        node \u003d self.node"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_56da5617","line":3593,"updated":"2018-01-25 16:17:04.000000000","message":"I can\u0027t help but feel like this might be overkill, but then, I didn\u0027t look to see what we did for other provision states. If we do want all these tests, I can\u0027t help but think we could have some helper functions to deal with them.","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"7adad4dba4cf7f5428ce577b2565e0684f673136","unresolved":false,"context_lines":[{"line_number":3590,"context_line":"                            headers\u003d{api_base.Version.string: \"1.38\"},"},{"line_number":3591,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":3592,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)"},{"line_number":3593,"context_line":"        self.assertFalse(self.mock_dnur.called)"},{"line_number":3594,"context_line":""},{"line_number":3595,"context_line":"    def test_inspect_already_in_progress(self):"},{"line_number":3596,"context_line":"        node \u003d self.node"}],"source_content_type":"text/x-python","patch_set":82,"id":"5f93b717_eafd933a","line":3593,"in_reply_to":"5f93b717_56da5617","updated":"2018-01-27 03:18:04.000000000","message":"Done","commit_id":"8866e4fbb335d79d7eea16f7c745cdd3c849cea8"}],"ironic/tests/unit/api/controllers/v1/test_utils.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @mock.patch.object(pecan, \u0027request\u0027, spec_set\u003d[\u0027version\u0027])"},{"line_number":481,"context_line":"    def test_allow_rescue_interface(self, mock_request):"},{"line_number":482,"context_line":"        mock_request.version.minor \u003d 37"},{"line_number":483,"context_line":"        self.assertTrue(utils.allow_rescue_interface())"},{"line_number":484,"context_line":"        mock_request.version.minor \u003d 36"},{"line_number":485,"context_line":"        self.assertFalse(utils.allow_rescue_interface())"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_d493d44e","line":482,"updated":"2018-01-25 03:29:53.000000000","message":"update to 38","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @mock.patch.object(pecan, \u0027request\u0027, spec_set\u003d[\u0027version\u0027])"},{"line_number":481,"context_line":"    def test_allow_rescue_interface(self, mock_request):"},{"line_number":482,"context_line":"        mock_request.version.minor \u003d 37"},{"line_number":483,"context_line":"        self.assertTrue(utils.allow_rescue_interface())"},{"line_number":484,"context_line":"        mock_request.version.minor \u003d 36"},{"line_number":485,"context_line":"        self.assertFalse(utils.allow_rescue_interface())"}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_da621bd9","line":482,"in_reply_to":"5f93b717_d493d44e","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":481,"context_line":"    def test_allow_rescue_interface(self, mock_request):"},{"line_number":482,"context_line":"        mock_request.version.minor \u003d 37"},{"line_number":483,"context_line":"        self.assertTrue(utils.allow_rescue_interface())"},{"line_number":484,"context_line":"        mock_request.version.minor \u003d 36"},{"line_number":485,"context_line":"        self.assertFalse(utils.allow_rescue_interface())"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_1474dc34","line":484,"updated":"2018-01-25 03:29:53.000000000","message":"update to 37","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":481,"context_line":"    def test_allow_rescue_interface(self, mock_request):"},{"line_number":482,"context_line":"        mock_request.version.minor \u003d 37"},{"line_number":483,"context_line":"        self.assertTrue(utils.allow_rescue_interface())"},{"line_number":484,"context_line":"        mock_request.version.minor \u003d 36"},{"line_number":485,"context_line":"        self.assertFalse(utils.allow_rescue_interface())"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5f93b717_fa5fd70b","line":484,"in_reply_to":"5f93b717_1474dc34","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"}],"ironic/tests/unit/api/v1/test_nodes.py":[{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"dcb81de028c3f97273e034dac71e0fa8e7bf01d5","unresolved":false,"context_lines":[{"line_number":2665,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2666,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2667,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2668,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":2669,"context_line":""},{"line_number":2670,"context_line":"    def test_provision_rescue_no_password(self):"},{"line_number":2671,"context_line":"        self.node.provision_state \u003d states.ACTIVE"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_1a7d816e","line":2668,"updated":"2017-01-20 04:14:32.000000000","message":"Is the following check needed here?\n\nself.assertFalse(self.mock_dnr.called)","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":2665,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2666,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2667,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2668,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":2669,"context_line":""},{"line_number":2670,"context_line":"    def test_provision_rescue_no_password(self):"},{"line_number":2671,"context_line":"        self.node.provision_state \u003d states.ACTIVE"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_4b755896","line":2668,"in_reply_to":"5a3905b3_1a7d816e","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"dcb81de028c3f97273e034dac71e0fa8e7bf01d5","unresolved":false,"context_lines":[{"line_number":2674,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":2675,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2676,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2677,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":2678,"context_line":""},{"line_number":2679,"context_line":"    def test_provision_rescue_in_active(self):"},{"line_number":2680,"context_line":"        self.node.provision_state \u003d states.ACTIVE"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_5a970990","line":2677,"updated":"2017-01-20 04:14:32.000000000","message":"Is the following check needed here?\n\nself.assertFalse(self.mock_dnr.called)","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":2674,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027]},"},{"line_number":2675,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2676,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2677,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":2678,"context_line":""},{"line_number":2679,"context_line":"    def test_provision_rescue_in_active(self):"},{"line_number":2680,"context_line":"        self.node.provision_state \u003d states.ACTIVE"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_2b5f2c0f","line":2677,"in_reply_to":"5a3905b3_5a970990","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"dcb81de028c3f97273e034dac71e0fa8e7bf01d5","unresolved":false,"context_lines":[{"line_number":2691,"context_line":"    def test_provision_rescue_in_deleting(self):"},{"line_number":2692,"context_line":"        node \u003d self.node"},{"line_number":2693,"context_line":"        node.provision_state \u003d states.DELETING"},{"line_number":2694,"context_line":"        node.target_provision_state \u003d states.DELETED"},{"line_number":2695,"context_line":"        node.reservation \u003d \u0027fake-host\u0027"},{"line_number":2696,"context_line":"        node.save()"},{"line_number":2697,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_743bfe38","line":2694,"updated":"2017-01-20 04:14:32.000000000","message":"https://review.openstack.org/#/c/350831/22/ironic/common/states.py@128\n\nSuggests DELETED should not be used for target_provision_state. In tests, I think it\u0027s OK.","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":2691,"context_line":"    def test_provision_rescue_in_deleting(self):"},{"line_number":2692,"context_line":"        node \u003d self.node"},{"line_number":2693,"context_line":"        node.provision_state \u003d states.DELETING"},{"line_number":2694,"context_line":"        node.target_provision_state \u003d states.DELETED"},{"line_number":2695,"context_line":"        node.reservation \u003d \u0027fake-host\u0027"},{"line_number":2696,"context_line":"        node.save()"},{"line_number":2697,"context_line":"        ret \u003d self.put_json(\u0027/nodes/%s/states/provision\u0027 % node.uuid,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_abb87ce6","line":2694,"in_reply_to":"5a3905b3_743bfe38","updated":"2017-01-20 18:15:26.000000000","message":"changed to AVAILABLE","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2700,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2701,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2702,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)  # Conflict"},{"line_number":2703,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":2704,"context_line":""},{"line_number":2705,"context_line":"    def test_provision_rescue_in_rescue(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_de413a3b","line":2702,"updated":"2017-01-19 21:52:22.000000000","message":"this comment seems unnecessary","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2700,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2701,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2702,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)  # Conflict"},{"line_number":2703,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":2704,"context_line":""},{"line_number":2705,"context_line":"    def test_provision_rescue_in_rescue(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_4ba2b8af","line":2702,"in_reply_to":"5a3905b3_de413a3b","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2743,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2744,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2745,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)  # Conflict"},{"line_number":2746,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":2747,"context_line":""},{"line_number":2748,"context_line":"    def test_provision_rescue_in_rescuing(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_fe3ef6b6","line":2745,"updated":"2017-01-19 21:52:22.000000000","message":"ditto\n(and ditto all the way down)","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2743,"context_line":"                            headers\u003d{api_base.Version.string: \"1.29\"},"},{"line_number":2744,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":2745,"context_line":"        self.assertEqual(http_client.CONFLICT, ret.status_code)  # Conflict"},{"line_number":2746,"context_line":"        self.assertFalse(self.mock_dnr.called)"},{"line_number":2747,"context_line":""},{"line_number":2748,"context_line":"    def test_provision_rescue_in_rescuing(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_8bb100e4","line":2745,"in_reply_to":"5a3905b3_fe3ef6b6","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"d8e3d0e27052e6a0ba173661954b64b84d92e208","unresolved":false,"context_lines":[{"line_number":2852,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":2853,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2854,"context_line":"                            headers\u003d{api_base.Version.string: \"1.32\"})"},{"line_number":2855,"context_line":"        self.assertEqual(202, ret.status_code)"},{"line_number":2856,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":2857,"context_line":"        self.mock_dnr.assert_called_once_with("},{"line_number":2858,"context_line":"            mock.ANY, self.node.uuid, \u0027password\u0027, \u0027test-topic\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"3f1d235d_cbf07600","line":2855,"range":{"start_line":2855,"start_character":25,"end_line":2855,"end_character":28},"updated":"2017-07-04 14:17:12.000000000","message":"http_client.ACCEPTED is preferred.","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"},{"author":{"_account_id":15074,"name":"Aparna","email":"aparnavtce@gmail.com","username":"Aparna"},"change_message_id":"87637f5000a5334e692e644331f7386e5f1c2639","unresolved":false,"context_lines":[{"line_number":2852,"context_line":"                            {\u0027target\u0027: states.VERBS[\u0027rescue\u0027],"},{"line_number":2853,"context_line":"                             \u0027rescue_password\u0027: \u0027password\u0027},"},{"line_number":2854,"context_line":"                            headers\u003d{api_base.Version.string: \"1.32\"})"},{"line_number":2855,"context_line":"        self.assertEqual(202, ret.status_code)"},{"line_number":2856,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":2857,"context_line":"        self.mock_dnr.assert_called_once_with("},{"line_number":2858,"context_line":"            mock.ANY, self.node.uuid, \u0027password\u0027, \u0027test-topic\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"1f1a1f67_657a0925","line":2855,"range":{"start_line":2855,"start_character":25,"end_line":2855,"end_character":28},"in_reply_to":"3f1d235d_cbf07600","updated":"2017-07-13 10:39:56.000000000","message":"Done","commit_id":"21a1190bf830ce1ca21c445580fd76fe5658a09c"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0673062a66ccd592c6fa69d0c1f7c0cc86a4d189","unresolved":false,"context_lines":[{"line_number":2622,"context_line":"        self.assertEqual(states.UNRESCUEFAIL, node.provision_state)"},{"line_number":2623,"context_line":"        self.assertEqual(states.ACTIVE, node.target_provision_state)"},{"line_number":2624,"context_line":"        self.assertTrue(node.last_error.startswith(\u0027Failed to unrescue.\u0027))"},{"line_number":2625,"context_line":""},{"line_number":2626,"context_line":""},{"line_number":2627,"context_line":"@mgr_utils.mock_record_keepalive"},{"line_number":2628,"context_line":"class DoNodeVerifyTestCase(mgr_utils.ServiceSetUpMixin,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_3d59615b","line":2625,"updated":"2016-11-15 18:34:14.000000000","message":"Please add some tests for the InvalidState cases, too.","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"349c0cbbe98a87c5643f544a084948ffcd0c2889","unresolved":false,"context_lines":[{"line_number":2622,"context_line":"        self.assertEqual(states.UNRESCUEFAIL, node.provision_state)"},{"line_number":2623,"context_line":"        self.assertEqual(states.ACTIVE, node.target_provision_state)"},{"line_number":2624,"context_line":"        self.assertTrue(node.last_error.startswith(\u0027Failed to unrescue.\u0027))"},{"line_number":2625,"context_line":""},{"line_number":2626,"context_line":""},{"line_number":2627,"context_line":"@mgr_utils.mock_record_keepalive"},{"line_number":2628,"context_line":"class DoNodeVerifyTestCase(mgr_utils.ServiceSetUpMixin,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_cec7f262","line":2625,"in_reply_to":"7a77a97e_06e026cc","updated":"2016-11-21 16:09:18.000000000","message":"Oops, missed those. I think you\u0027ll need to modify those to check for ExpectedException instead on the next patch set, though","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"1a7fda91214b9d6ec86b611afefe0d27ab7975ae","unresolved":false,"context_lines":[{"line_number":2622,"context_line":"        self.assertEqual(states.UNRESCUEFAIL, node.provision_state)"},{"line_number":2623,"context_line":"        self.assertEqual(states.ACTIVE, node.target_provision_state)"},{"line_number":2624,"context_line":"        self.assertTrue(node.last_error.startswith(\u0027Failed to unrescue.\u0027))"},{"line_number":2625,"context_line":""},{"line_number":2626,"context_line":""},{"line_number":2627,"context_line":"@mgr_utils.mock_record_keepalive"},{"line_number":2628,"context_line":"class DoNodeVerifyTestCase(mgr_utils.ServiceSetUpMixin,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_06e026cc","line":2625,"in_reply_to":"7a77a97e_3d59615b","updated":"2016-11-18 22:51:31.000000000","message":"lines 2450 and 2553. Is there a specific test beyond these we need to add?","commit_id":"5e7fea5b121a184efdfecaf812fbd3be293ee134"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"99a9ac6505267a61125e8b446d42acd9b4e2a9d7","unresolved":false,"context_lines":[{"line_number":2527,"context_line":"class DoNodeRescueTestCase(mgr_utils.CommonMixIn, mgr_utils.ServiceSetUpMixin,"},{"line_number":2528,"context_line":"                           tests_db_base.DbTestCase):"},{"line_number":2529,"context_line":"    @mock.patch(\u0027ironic.conductor.task_manager.acquire\u0027, autospec\u003dTrue)"},{"line_number":2530,"context_line":"    def test_do_node_rescue(self, acquire_mock):"},{"line_number":2531,"context_line":"        self._start_service()"},{"line_number":2532,"context_line":"        task \u003d self._create_task("},{"line_number":2533,"context_line":"            node_attrs\u003ddict(driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_4b7f4aaa","line":2530,"range":{"start_line":2530,"start_character":34,"end_line":2530,"end_character":46},"updated":"2017-01-19 21:59:43.000000000","message":"Can this be consistent?\n\nEither \u0027mock_*\u0027 or \u0027*_mock\u0027 in this class.\n\nI vote for \u0027mock_*\u0027","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":2527,"context_line":"class DoNodeRescueTestCase(mgr_utils.CommonMixIn, mgr_utils.ServiceSetUpMixin,"},{"line_number":2528,"context_line":"                           tests_db_base.DbTestCase):"},{"line_number":2529,"context_line":"    @mock.patch(\u0027ironic.conductor.task_manager.acquire\u0027, autospec\u003dTrue)"},{"line_number":2530,"context_line":"    def test_do_node_rescue(self, acquire_mock):"},{"line_number":2531,"context_line":"        self._start_service()"},{"line_number":2532,"context_line":"        task \u003d self._create_task("},{"line_number":2533,"context_line":"            node_attrs\u003ddict(driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_ab5ebc73","line":2530,"range":{"start_line":2530,"start_character":34,"end_line":2530,"end_character":46},"in_reply_to":"5a3905b3_4b7f4aaa","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"99a9ac6505267a61125e8b446d42acd9b4e2a9d7","unresolved":false,"context_lines":[{"line_number":2533,"context_line":"            node_attrs\u003ddict(driver\u003d\u0027fake\u0027,"},{"line_number":2534,"context_line":"                            provision_state\u003dstates.ACTIVE))"},{"line_number":2535,"context_line":"        acquire_mock.side_effect \u003d self._get_acquire_side_effect(task)"},{"line_number":2536,"context_line":"        with mock.patch.object(task, \u0027process_event\u0027) as process_mock:"},{"line_number":2537,"context_line":"            self.service.do_node_rescue(self.context, task.node.uuid,"},{"line_number":2538,"context_line":"                                        \"password\")"},{"line_number":2539,"context_line":"            process_mock.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_4b2d8aa6","line":2536,"updated":"2017-01-19 21:59:43.000000000","message":"Why not just do a @mock.patch on the function?","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":2533,"context_line":"            node_attrs\u003ddict(driver\u003d\u0027fake\u0027,"},{"line_number":2534,"context_line":"                            provision_state\u003dstates.ACTIVE))"},{"line_number":2535,"context_line":"        acquire_mock.side_effect \u003d self._get_acquire_side_effect(task)"},{"line_number":2536,"context_line":"        with mock.patch.object(task, \u0027process_event\u0027) as process_mock:"},{"line_number":2537,"context_line":"            self.service.do_node_rescue(self.context, task.node.uuid,"},{"line_number":2538,"context_line":"                                        \"password\")"},{"line_number":2539,"context_line":"            process_mock.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_8b458071","line":2536,"in_reply_to":"5a3905b3_4b2d8aa6","updated":"2017-01-20 18:15:26.000000000","message":"_create_task returns a Mock task from CommonMixIn which has a mocked process_event. Therefore, we do not need a decorator to mock out the actual process_event call. In fact, since the mixin mocks the call already, we don\u0027t need to mock it again here at all. Updated.","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"64c1ca3611572ace49d141a929387530b3cbb69f","unresolved":false,"context_lines":[{"line_number":2678,"context_line":"            \u0027rescue\u0027,"},{"line_number":2679,"context_line":"            callback\u003dself.service._spawn_worker,"},{"line_number":2680,"context_line":"            call_args\u003d(self.service._do_node_rescue, task, \"password\"),"},{"line_number":2681,"context_line":"            err_handler\u003dconductor_utils.provisioning_error_handler)"},{"line_number":2682,"context_line":""},{"line_number":2683,"context_line":"    def test_do_node_rescue_invalid_state(self):"},{"line_number":2684,"context_line":"        self._start_service()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_71b11ae1","line":2681,"range":{"start_line":2681,"start_character":12,"end_line":2681,"end_character":67},"updated":"2017-03-09 05:38:10.000000000","message":"Need to validate instance_info\nself.assertIn(\u0027rescue_password\u0027, node.instance_info)","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":2678,"context_line":"            \u0027rescue\u0027,"},{"line_number":2679,"context_line":"            callback\u003dself.service._spawn_worker,"},{"line_number":2680,"context_line":"            call_args\u003d(self.service._do_node_rescue, task, \"password\"),"},{"line_number":2681,"context_line":"            err_handler\u003dconductor_utils.provisioning_error_handler)"},{"line_number":2682,"context_line":""},{"line_number":2683,"context_line":"    def test_do_node_rescue_invalid_state(self):"},{"line_number":2684,"context_line":"        self._start_service()"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_1d136c5c","line":2681,"range":{"start_line":2681,"start_character":12,"end_line":2681,"end_character":67},"in_reply_to":"9a30ddce_71b11ae1","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"6e579b80c4d42ba11b127ad70ce80bb0a8cb8d69","unresolved":false,"context_lines":[{"line_number":2693,"context_line":""},{"line_number":2694,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":2695,"context_line":"    def test_do_node_rescue_validate_fail(self, mock_validate):"},{"line_number":2696,"context_line":"        # InvalidParameterValue should be re-raised as InstanceDeployFailure"},{"line_number":2697,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":2698,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2699,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_269cca68","line":2696,"range":{"start_line":2696,"start_character":55,"end_line":2696,"end_character":76},"updated":"2017-03-09 05:20:21.000000000","message":"Should this be InstanceRescueFailure?","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":2693,"context_line":""},{"line_number":2694,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":2695,"context_line":"    def test_do_node_rescue_validate_fail(self, mock_validate):"},{"line_number":2696,"context_line":"        # InvalidParameterValue should be re-raised as InstanceDeployFailure"},{"line_number":2697,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":2698,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2699,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_5d196478","line":2696,"range":{"start_line":2696,"start_character":55,"end_line":2696,"end_character":76},"in_reply_to":"9a30ddce_269cca68","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"6e579b80c4d42ba11b127ad70ce80bb0a8cb8d69","unresolved":false,"context_lines":[{"line_number":2804,"context_line":""},{"line_number":2805,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":2806,"context_line":"    def test_do_node_unrescue_validate_fail(self, mock_validate):"},{"line_number":2807,"context_line":"        # InvalidParameterValue should be re-raised as InstanceDeployFailure"},{"line_number":2808,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":2809,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2810,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a30ddce_06fee636","line":2807,"range":{"start_line":2807,"start_character":55,"end_line":2807,"end_character":76},"updated":"2017-03-09 05:20:21.000000000","message":"Should it be InstanceUnrescueFailure?","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":2804,"context_line":""},{"line_number":2805,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":2806,"context_line":"    def test_do_node_unrescue_validate_fail(self, mock_validate):"},{"line_number":2807,"context_line":"        # InvalidParameterValue should be re-raised as InstanceDeployFailure"},{"line_number":2808,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":2809,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2810,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a1ced50_fd3cd0c9","line":2807,"range":{"start_line":2807,"start_character":55,"end_line":2807,"end_character":76},"in_reply_to":"9a30ddce_06fee636","updated":"2017-03-21 19:16:54.000000000","message":"Done","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":22860,"name":"Solio Sarabia","email":"solio.sarabia@intel.com","username":"ssarabia"},"change_message_id":"b5f5668bd84ce4503f35e65ea2db11d5f4575780","unresolved":false,"context_lines":[{"line_number":2834,"context_line":"        self.assertEqual(exception.InstanceUnrescueFailure, exc.exc_info[0])"},{"line_number":2835,"context_line":""},{"line_number":2836,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeRescue.unrescue\u0027)"},{"line_number":2837,"context_line":"    def test__do_node_unrescue(self, mock_rescue):"},{"line_number":2838,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"},{"line_number":2839,"context_line":"                                          provision_state\u003dstates.UNRESCUING,"},{"line_number":2840,"context_line":"                                          instance_info\u003d{\u0027rescue_password\u0027:"}],"source_content_type":"text/x-python","patch_set":37,"id":"bff0334d_f176073f","line":2837,"range":{"start_line":2837,"start_character":37,"end_line":2837,"end_character":48},"updated":"2017-04-05 17:52:57.000000000","message":"nit: s/mock_rescue/mock_unrescue\nditto L2855, L2874","commit_id":"6806ebed2f87f4c36db7bfc891adb1df19dccff1"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"04084a8aa1a491b15582a966cb697c600b0ba92f","unresolved":false,"context_lines":[{"line_number":2834,"context_line":"        self.assertEqual(exception.InstanceUnrescueFailure, exc.exc_info[0])"},{"line_number":2835,"context_line":""},{"line_number":2836,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeRescue.unrescue\u0027)"},{"line_number":2837,"context_line":"    def test__do_node_unrescue(self, mock_rescue):"},{"line_number":2838,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"},{"line_number":2839,"context_line":"                                          provision_state\u003dstates.UNRESCUING,"},{"line_number":2840,"context_line":"                                          instance_info\u003d{\u0027rescue_password\u0027:"}],"source_content_type":"text/x-python","patch_set":37,"id":"bff0334d_ba441775","line":2837,"range":{"start_line":2837,"start_character":37,"end_line":2837,"end_character":48},"in_reply_to":"bff0334d_f176073f","updated":"2017-04-11 21:13:18.000000000","message":"Done","commit_id":"6806ebed2f87f4c36db7bfc891adb1df19dccff1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"1ab3aeeb5d0bba9462be3d084f15b34ee111abc4","unresolved":false,"context_lines":[{"line_number":2967,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":2968,"context_line":"    def test_do_node_unrescue_validate_fail(self, mock_validate):"},{"line_number":2969,"context_line":"        # InvalidParameterValue should be re-raised as InstanceUnrescueFailure"},{"line_number":2970,"context_line":"        self.config(enabled_rescue_interfaces\u003d[\u0027fake\u0027])"},{"line_number":2971,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":2972,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2973,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_3e06c553","line":2970,"updated":"2018-01-18 15:01:59.000000000","message":"This doesn\u0027t seem necessary.","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":2967,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":2968,"context_line":"    def test_do_node_unrescue_validate_fail(self, mock_validate):"},{"line_number":2969,"context_line":"        # InvalidParameterValue should be re-raised as InstanceUnrescueFailure"},{"line_number":2970,"context_line":"        self.config(enabled_rescue_interfaces\u003d[\u0027fake\u0027])"},{"line_number":2971,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":2972,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2973,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_12795c2e","line":2970,"in_reply_to":"7f96bb07_3e06c553","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"1ab3aeeb5d0bba9462be3d084f15b34ee111abc4","unresolved":false,"context_lines":[{"line_number":3228,"context_line":"        mock_iwdi.return_value \u003d False"},{"line_number":3229,"context_line":"        target_raid_config \u003d {\u0027logical_disks\u0027: [{\u0027size_gb\u0027: 1,"},{"line_number":3230,"context_line":"                                                 \u0027raid_level\u0027: \u00271\u0027}]}"},{"line_number":3231,"context_line":"        self.config(enabled_hardware_types\u003d[\u0027fake-hardware\u0027])"},{"line_number":3232,"context_line":"        self.config(enabled_rescue_interfaces\u003d[\u0027fake\u0027])"},{"line_number":3233,"context_line":"        self.config(default_rescue_interface\u003d\u0027fake\u0027)"},{"line_number":3234,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":3235,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_d92d7b95","line":3232,"range":{"start_line":3231,"start_character":0,"end_line":3232,"end_character":55},"updated":"2018-01-18 15:01:59.000000000","message":"There are already set in SetUp().","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":3228,"context_line":"        mock_iwdi.return_value \u003d False"},{"line_number":3229,"context_line":"        target_raid_config \u003d {\u0027logical_disks\u0027: [{\u0027size_gb\u0027: 1,"},{"line_number":3230,"context_line":"                                                 \u0027raid_level\u0027: \u00271\u0027}]}"},{"line_number":3231,"context_line":"        self.config(enabled_hardware_types\u003d[\u0027fake-hardware\u0027])"},{"line_number":3232,"context_line":"        self.config(enabled_rescue_interfaces\u003d[\u0027fake\u0027])"},{"line_number":3233,"context_line":"        self.config(default_rescue_interface\u003d\u0027fake\u0027)"},{"line_number":3234,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":3235,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_b2aae86e","line":3232,"range":{"start_line":3231,"start_character":0,"end_line":3232,"end_character":55},"in_reply_to":"7f96bb07_d92d7b95","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"1ab3aeeb5d0bba9462be3d084f15b34ee111abc4","unresolved":false,"context_lines":[{"line_number":3230,"context_line":"                                                 \u0027raid_level\u0027: \u00271\u0027}]}"},{"line_number":3231,"context_line":"        self.config(enabled_hardware_types\u003d[\u0027fake-hardware\u0027])"},{"line_number":3232,"context_line":"        self.config(enabled_rescue_interfaces\u003d[\u0027fake\u0027])"},{"line_number":3233,"context_line":"        self.config(default_rescue_interface\u003d\u0027fake\u0027)"},{"line_number":3234,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":3235,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":3236,"context_line":"            target_raid_config\u003dtarget_raid_config,"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_99a6130f","line":3233,"updated":"2018-01-18 15:01:59.000000000","message":"This is unnecessary because fake-hardware supports only fake rescue interface.","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":3230,"context_line":"                                                 \u0027raid_level\u0027: \u00271\u0027}]}"},{"line_number":3231,"context_line":"        self.config(enabled_hardware_types\u003d[\u0027fake-hardware\u0027])"},{"line_number":3232,"context_line":"        self.config(enabled_rescue_interfaces\u003d[\u0027fake\u0027])"},{"line_number":3233,"context_line":"        self.config(default_rescue_interface\u003d\u0027fake\u0027)"},{"line_number":3234,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":3235,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":3236,"context_line":"            target_raid_config\u003dtarget_raid_config,"}],"source_content_type":"text/x-python","patch_set":77,"id":"7f96bb07_d2a774a7","line":3233,"in_reply_to":"7f96bb07_99a6130f","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"}],"ironic/tests/unit/conductor/test_rpcapi.py":[{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"20c80ff49e1cacb17ebece86a7827620b00ee50c","unresolved":false,"context_lines":[{"line_number":455,"context_line":"                          node_id\u003d\u0027fake-node\u0027,"},{"line_number":456,"context_line":"                          version\u003d\u00271.38\u0027)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def test_do_node_rescue(self):"},{"line_number":459,"context_line":"        self._test_rpcapi(\u0027do_node_rescue\u0027,"},{"line_number":460,"context_line":"                          \u0027call\u0027,"},{"line_number":461,"context_line":"                          version\u003d\u00271.40\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_5e82aa53","line":458,"updated":"2017-01-19 21:52:22.000000000","message":"should there be a test case with empty pass?","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":455,"context_line":"                          node_id\u003d\u0027fake-node\u0027,"},{"line_number":456,"context_line":"                          version\u003d\u00271.38\u0027)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def test_do_node_rescue(self):"},{"line_number":459,"context_line":"        self._test_rpcapi(\u0027do_node_rescue\u0027,"},{"line_number":460,"context_line":"                          \u0027call\u0027,"},{"line_number":461,"context_line":"                          version\u003d\u00271.40\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_0637c7e3","line":458,"in_reply_to":"5a3905b3_5e82aa53","updated":"2017-01-20 18:15:26.000000000","message":"I\u0027m not sure if you\u0027re asking if there should be another test or why this test has no assert or something else entirely. The reason it has no assert is that it raises an exception if do_node_rescue is not available in 1.40 and follows the pattern of the rest of the tests here. Does that answer the question?","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"}],"releasenotes/notes/rescue-node-87e3b673c61ef628.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.36 of the REST API, which provides:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue`` which allows an operator to move a node into ``rescue``"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_c72a7e7d","line":4,"updated":"2017-11-28 23:09:45.000000000","message":"Dmitry seems to like s/REST API/Bare Metal API/","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.36 of the REST API, which provides:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue`` which allows an operator to move a node into ``rescue``"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_09a91b7a","line":4,"in_reply_to":"ff82abbf_c72a7e7d","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue`` which allows an operator to move a node into ``rescue``"},{"line_number":8,"context_line":"      state from ``active`` state and from ``rescue`` state into an ``active``"},{"line_number":9,"context_line":"      state respectively. After rescuing a node, it will be left in the"},{"line_number":10,"context_line":"      ``rescue`` state running a rescue ramdisk, configured with the"},{"line_number":11,"context_line":"      ``rescue_password``, and listening with ssh on the specified network"},{"line_number":12,"context_line":"      interfaces. Unrescuing a node will return it to ``active`` state."}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_0749465e","line":9,"updated":"2017-11-28 23:09:45.000000000","message":"This first sentence is awkward, also it mixes singular with plural things.\nMaybe separate into two bullets, one for \u0027rescue\u0027 and the other for \u0027unrescue\u0027.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue`` which allows an operator to move a node into ``rescue``"},{"line_number":8,"context_line":"      state from ``active`` state and from ``rescue`` state into an ``active``"},{"line_number":9,"context_line":"      state respectively. After rescuing a node, it will be left in the"},{"line_number":10,"context_line":"      ``rescue`` state running a rescue ramdisk, configured with the"},{"line_number":11,"context_line":"      ``rescue_password``, and listening with ssh on the specified network"},{"line_number":12,"context_line":"      interfaces. Unrescuing a node will return it to ``active`` state."}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_0e6d9c97","line":9,"in_reply_to":"ff82abbf_0749465e","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":8,"context_line":"      state from ``active`` state and from ``rescue`` state into an ``active``"},{"line_number":9,"context_line":"      state respectively. After rescuing a node, it will be left in the"},{"line_number":10,"context_line":"      ``rescue`` state running a rescue ramdisk, configured with the"},{"line_number":11,"context_line":"      ``rescue_password``, and listening with ssh on the specified network"},{"line_number":12,"context_line":"      interfaces. Unrescuing a node will return it to ``active`` state."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    * the ``rescue_interface`` field of the node resource. It also exposes"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_07906694","line":11,"updated":"2017-11-28 23:09:45.000000000","message":"I think we need to mention that PUT /v1/node/.. whatever-it-is can now handle \u0027rescue\u0027, and that rescue_password is required.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":8,"context_line":"      state from ``active`` state and from ``rescue`` state into an ``active``"},{"line_number":9,"context_line":"      state respectively. After rescuing a node, it will be left in the"},{"line_number":10,"context_line":"      ``rescue`` state running a rescue ramdisk, configured with the"},{"line_number":11,"context_line":"      ``rescue_password``, and listening with ssh on the specified network"},{"line_number":12,"context_line":"      interfaces. Unrescuing a node will return it to ``active`` state."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    * the ``rescue_interface`` field of the node resource. It also exposes"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_2e6ae07f","line":11,"in_reply_to":"ff82abbf_07906694","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    * the ``rescue_interface`` field of the node resource. It also exposes"},{"line_number":15,"context_line":"      ``default_rescue_interface`` and ``enable_rescue_interfaces`` fields"},{"line_number":16,"context_line":"      of the driver resource."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_87f1d603","line":16,"updated":"2017-11-28 23:09:45.000000000","message":"I\u0027d probably do this in a separate bullet.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    * the ``rescue_interface`` field of the node resource. It also exposes"},{"line_number":15,"context_line":"      ``default_rescue_interface`` and ``enable_rescue_interfaces`` fields"},{"line_number":16,"context_line":"      of the driver resource."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_6ef548cb","line":16,"in_reply_to":"ff82abbf_87f1d603","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      ``default_rescue_interface`` and ``enable_rescue_interfaces`` fields"},{"line_number":16,"context_line":"      of the driver resource."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"},{"line_number":20,"context_line":"    ``[DEFAULT]/enabled_rescue_interfaces`` configuration option. A default"},{"line_number":21,"context_line":"    interface for a created node can be specified with"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_47c8aea4","line":18,"updated":"2017-11-28 23:09:45.000000000","message":"maybe put this line with the bullet at L14.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      ``default_rescue_interface`` and ``enable_rescue_interfaces`` fields"},{"line_number":16,"context_line":"      of the driver resource."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"},{"line_number":20,"context_line":"    ``[DEFAULT]/enabled_rescue_interfaces`` configuration option. A default"},{"line_number":21,"context_line":"    interface for a created node can be specified with"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_ae2cb047","line":18,"in_reply_to":"ff82abbf_47c8aea4","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":16,"context_line":"      of the driver resource."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"},{"line_number":20,"context_line":"    ``[DEFAULT]/enabled_rescue_interfaces`` configuration option. A default"},{"line_number":21,"context_line":"    interface for a created node can be specified with"},{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_a742da0d","line":19,"updated":"2017-11-28 23:09:45.000000000","message":"And a new bullet that starts with something like \n\nAdds new configuration options ``[DEFAULT]/...","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"      of the driver resource."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"},{"line_number":20,"context_line":"    ``[DEFAULT]/enabled_rescue_interfaces`` configuration option. A default"},{"line_number":21,"context_line":"    interface for a created node can be specified with"},{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_8eaa0c83","line":19,"in_reply_to":"ff82abbf_a742da0d","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"},{"line_number":20,"context_line":"    ``[DEFAULT]/enabled_rescue_interfaces`` configuration option. A default"},{"line_number":21,"context_line":"    interface for a created node can be specified with"},{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_c7d4be4a","line":21,"updated":"2017-11-28 23:09:45.000000000","message":"this interface is only used when creating a node; \u0027created node\u0027 makes it sound like we\u0027ll use this default interface if the node has already been created, but that isn\u0027t true, is it?","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    A rescue interface can be set when creating or updating a node. Enabled"},{"line_number":19,"context_line":"    rescue interfaces are defined via the"},{"line_number":20,"context_line":"    ``[DEFAULT]/enabled_rescue_interfaces`` configuration option. A default"},{"line_number":21,"context_line":"    interface for a created node can be specified with"},{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_4ee64419","line":21,"in_reply_to":"ff82abbf_c7d4be4a","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    interface for a created node can be specified with"},{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"},{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_6748522c","line":24,"updated":"2017-11-28 23:09:45.000000000","message":"s/new options/new configuration options/","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    interface for a created node can be specified with"},{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"},{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_6ee30807","line":24,"in_reply_to":"ff82abbf_6748522c","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"},{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Adds support for providing separate ``rescuing`` network with its security"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_8758f6f9","line":25,"updated":"2017-11-28 23:09:45.000000000","message":"I\u0027m not sure I\u0027d use the term \u0027clean up\u0027 to avoid confusion with the cleaning process...","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    ``[DEFAULT]/default_rescue_interface`` configuration option."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"},{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Adds support for providing separate ``rescuing`` network with its security"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_0ec91c77","line":25,"in_reply_to":"ff82abbf_8758f6f9","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"},{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Adds support for providing separate ``rescuing`` network with its security"},{"line_number":29,"context_line":"    groups using new options ``[neutron]/rescue_network`` and"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_076ce699","line":26,"updated":"2017-11-28 23:09:45.000000000","message":"the public string isn\u0027t \u0027RESCUEWAIT\u0027, it is probably something like \u0027rescue wait\u0027 ?","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Adds new options ``[conductor]/check_rescue_state_interval`` and"},{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Adds support for providing separate ``rescuing`` network with its security"},{"line_number":29,"context_line":"    groups using new options ``[neutron]/rescue_network`` and"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_6ecc6889","line":26,"in_reply_to":"ff82abbf_076ce699","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Adds support for providing separate ``rescuing`` network with its security"},{"line_number":29,"context_line":"    groups using new options ``[neutron]/rescue_network`` and"},{"line_number":30,"context_line":"    ``[neutron]/rescue_network_security_groups`` respectively."},{"line_number":31,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_e70a22d0","line":28,"updated":"2017-11-28 23:09:45.000000000","message":"We need to mention that this option (the rescue_network one) is required.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    ``[conductor]/rescue_callback_timeout`` to clean up nodes stuck in the"},{"line_number":26,"context_line":"    ``RESCUEWAIT`` state upon timeout."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    Adds support for providing separate ``rescuing`` network with its security"},{"line_number":29,"context_line":"    groups using new options ``[neutron]/rescue_network`` and"},{"line_number":30,"context_line":"    ``[neutron]/rescue_network_security_groups`` respectively."},{"line_number":31,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_aeafd092","line":28,"in_reply_to":"ff82abbf_e70a22d0","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":31,"context_line":"upgrade:"},{"line_number":32,"context_line":"  - |"},{"line_number":33,"context_line":"    Increases the worker threads in ironic by 1 to check the rescue wait"},{"line_number":34,"context_line":"    timeouts."}],"source_content_type":"text/x-yaml","patch_set":67,"id":"ff82abbf_67f612da","line":34,"updated":"2017-11-28 23:09:45.000000000","message":"I\u0027m not sure we need to mention this, but I guess it doesn\u0027t hurt.","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":31,"context_line":"upgrade:"},{"line_number":32,"context_line":"  - |"},{"line_number":33,"context_line":"    Increases the worker threads in ironic by 1 to check the rescue wait"},{"line_number":34,"context_line":"    timeouts."}],"source_content_type":"text/x-yaml","patch_set":67,"id":"df87a7cf_ce89f426","line":34,"in_reply_to":"ff82abbf_67f612da","updated":"2017-12-03 16:39:51.000000000","message":"Done","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"2f87fe89550845b9c3c8679bd73a670e1d27f5d6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.36 of the Bare Metal API, which provides:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue``."}],"source_content_type":"text/x-yaml","patch_set":73,"id":"bf8cb3f7_85e94b1b","line":4,"range":{"start_line":4,"start_character":17,"end_line":4,"end_character":21},"updated":"2017-12-27 04:11:16.000000000","message":"s/1.36/1.37/","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e6e466d9d79372c481d422149d5edbe28a27963c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.36 of the Bare Metal API, which provides:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue``."}],"source_content_type":"text/x-yaml","patch_set":73,"id":"9f91af0f_bc725ce2","line":4,"range":{"start_line":4,"start_character":17,"end_line":4,"end_character":21},"in_reply_to":"bf8cb3f7_85e94b1b","updated":"2018-01-06 14:52:54.000000000","message":"Done","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.37 of the Bare Metal API, which provides:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue``."}],"source_content_type":"text/x-yaml","patch_set":77,"id":"7f96bb07_27b0e6dc","line":4,"updated":"2018-01-18 21:59:55.000000000","message":"Adds version 1.37 of the Bare Metal API, which provides support for rescuing (and unrescuing) a node. This includes:\n\n* A node in the ``active`` provision state can be rescued via the ``GET /v1/nodes/{node_ident}/states/provisions`` API, by specifying ``rescue`` as the ``target`` value, and a ``rescue_password`` value. When the node has been rescued, it will be in the ``rescue`` provision state. A rescue ramdisk will be running, configured with the specified ``rescue_password``, and listening with ssh on the tenant network.\n\n* A node in the ``rescue`` provision state can be unrescued (to the ``active`` state) via the ``GET /v1/nodes/{node_ident}/states/provisions`` API, by specifying \u0027\u0027unrescue`` as the ``target`` value.\n\n... (I ran out of steam, the rest from L24 look ok although knowing me, i might comment on those later)","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"06a9870582c9713d89c3d40278d1ce721236711e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.37 of the Bare Metal API, which provides:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue``."}],"source_content_type":"text/x-yaml","patch_set":77,"id":"7f96bb07_a5661d29","line":4,"in_reply_to":"7f96bb07_27b0e6dc","updated":"2018-01-19 14:20:11.000000000","message":"Done","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6c12017ad1f24ec1044f1ded74c24e6bbcb1db37","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.37 of the Bare Metal API, which provides:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * a new provision state target verbs of ``rescue`` and"},{"line_number":7,"context_line":"      ``unrescue``."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * using ``rescue`` verb operator can move node from ``active`` state"}],"source_content_type":"text/x-yaml","patch_set":77,"id":"7f96bb07_6786ee68","line":6,"updated":"2018-01-18 21:59:55.000000000","message":"s/a //","commit_id":"84a32d214ec43c18885288950e73b5f0c8d959b8"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"df10873e08888203398bcd28116eef23aa804020","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    rescuing (and unrescuing) a node. This includes:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    *  A node in the ``active`` provision state can be rescued via the"},{"line_number":8,"context_line":"       ``GET /v1/nodes/{node_ident}/states/provisions`` API, by specifying"},{"line_number":9,"context_line":"       ``rescue`` as the ``target`` value, and a ``rescue_password``"},{"line_number":10,"context_line":"       value. When the node has been rescued, it will be in the ``rescue``"},{"line_number":11,"context_line":"       provision state. A rescue ramdisk will be running, configured with"}],"source_content_type":"text/x-yaml","patch_set":78,"id":"7f96bb07_c270dbdf","line":8,"range":{"start_line":8,"start_character":52,"end_line":8,"end_character":53},"updated":"2018-01-22 05:04:49.000000000","message":"s/provisions/provision/","commit_id":"31246c75d1b1430e6d818b2a37f908104e30543d"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    rescuing (and unrescuing) a node. This includes:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    *  A node in the ``active`` provision state can be rescued via the"},{"line_number":8,"context_line":"       ``GET /v1/nodes/{node_ident}/states/provisions`` API, by specifying"},{"line_number":9,"context_line":"       ``rescue`` as the ``target`` value, and a ``rescue_password``"},{"line_number":10,"context_line":"       value. When the node has been rescued, it will be in the ``rescue``"},{"line_number":11,"context_line":"       provision state. A rescue ramdisk will be running, configured with"}],"source_content_type":"text/x-yaml","patch_set":78,"id":"7f96bb07_599a59c5","line":8,"range":{"start_line":8,"start_character":52,"end_line":8,"end_character":53},"in_reply_to":"7f96bb07_c270dbdf","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"31246c75d1b1430e6d818b2a37f908104e30543d"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"df10873e08888203398bcd28116eef23aa804020","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    *  A node in the ``rescue`` provision state can be unrescued (to the"},{"line_number":16,"context_line":"       ``active`` state) via the"},{"line_number":17,"context_line":"       ``GET /v1/nodes/{node_ident}/states/provisions`` API, by specifying"},{"line_number":18,"context_line":"       ``unrescue`` as the ``target`` value."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * The ``rescue_interface`` field of the node resource. A rescue"}],"source_content_type":"text/x-yaml","patch_set":78,"id":"7f96bb07_627547cc","line":17,"range":{"start_line":17,"start_character":52,"end_line":17,"end_character":53},"updated":"2018-01-22 05:04:49.000000000","message":"s/provisions/provision/","commit_id":"31246c75d1b1430e6d818b2a37f908104e30543d"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    *  A node in the ``rescue`` provision state can be unrescued (to the"},{"line_number":16,"context_line":"       ``active`` state) via the"},{"line_number":17,"context_line":"       ``GET /v1/nodes/{node_ident}/states/provisions`` API, by specifying"},{"line_number":18,"context_line":"       ``unrescue`` as the ``target`` value."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * The ``rescue_interface`` field of the node resource. A rescue"}],"source_content_type":"text/x-yaml","patch_set":78,"id":"7f96bb07_799dd5b9","line":17,"range":{"start_line":17,"start_character":52,"end_line":17,"end_character":53},"in_reply_to":"7f96bb07_627547cc","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"31246c75d1b1430e6d818b2a37f908104e30543d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9798f47ffe19ca5d215b5b7422c5b2ca3930377","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.37 of the Bare Metal API, which provides supports for"},{"line_number":5,"context_line":"    rescuing (and unrescuing) a node. This includes:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    *  A node in the ``active`` provision state can be rescued via the"}],"source_content_type":"text/x-yaml","patch_set":80,"id":"5f93b717_f4905098","line":4,"range":{"start_line":4,"start_character":16,"end_line":4,"end_character":21},"updated":"2018-01-25 03:29:53.000000000","message":"s/1.37/1.38/","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"462e527d61b9d5aedb2df6a7082aa7943d0fb3b4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds version 1.37 of the Bare Metal API, which provides supports for"},{"line_number":5,"context_line":"    rescuing (and unrescuing) a node. This includes:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    *  A node in the ``active`` provision state can be rescued via the"}],"source_content_type":"text/x-yaml","patch_set":80,"id":"5f93b717_fa46f74f","line":4,"range":{"start_line":4,"start_character":16,"end_line":4,"end_character":21},"in_reply_to":"5f93b717_f4905098","updated":"2018-01-25 05:19:46.000000000","message":"Done","commit_id":"b9e9843544d2bb1f031bc3f46589fa093507eb8b"}],"tox.ini":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"99a9ac6505267a61125e8b446d42acd9b4e2a9d7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"[flake8]"},{"line_number":91,"context_line":"ignore \u003d E129"},{"line_number":92,"context_line":"exclude \u003d  .venv,.git,.tox,dist,doc,*lib/python*,*egg,build"},{"line_number":93,"context_line":"max-complexity\u003d19"},{"line_number":94,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":95,"context_line":"# [H203] Use assertIs(Not)None to check for None."},{"line_number":96,"context_line":"# [H904] Delay string interpolations at logging calls."}],"source_content_type":"text/x-properties","patch_set":22,"id":"5a3905b3_2b94bee0","line":93,"updated":"2017-01-19 21:59:43.000000000","message":"nit:\n\nMaybe a comment/todo that ironic/api/controllers/v1/node.py provision() function needs to be refactored to reduce this value.","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"f1f4cfc6230e8d4021a2ea25e96f2dea380583be","unresolved":false,"context_lines":[{"line_number":90,"context_line":"[flake8]"},{"line_number":91,"context_line":"ignore \u003d E129"},{"line_number":92,"context_line":"exclude \u003d  .venv,.git,.tox,dist,doc,*lib/python*,*egg,build"},{"line_number":93,"context_line":"max-complexity\u003d19"},{"line_number":94,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":95,"context_line":"# [H203] Use assertIs(Not)None to check for None."},{"line_number":96,"context_line":"# [H904] Delay string interpolations at logging calls."}],"source_content_type":"text/x-properties","patch_set":22,"id":"5a3905b3_e64c7b44","line":93,"in_reply_to":"5a3905b3_2b94bee0","updated":"2017-01-20 18:15:26.000000000","message":"Done","commit_id":"a0bc11387b85a3dbe5a7e79590abb9b1f4bc8116"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2fea75de3cb043375e5954a395563dd75b724bac","unresolved":false,"context_lines":[{"line_number":97,"context_line":"exclude \u003d  .venv,.git,.tox,dist,doc,*lib/python*,*egg,build"},{"line_number":98,"context_line":"import-order-style \u003d pep8"},{"line_number":99,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":100,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":101,"context_line":"max-complexity\u003d19"},{"line_number":102,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":103,"context_line":"# [H203] Use assertIs(Not)None to check for None."}],"source_content_type":"text/x-properties","patch_set":32,"id":"9a30ddce_8a54b921","line":100,"updated":"2017-03-08 11:35:01.000000000","message":"++ really needed","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"a1e1f201cb0cdef1347cf978a1b92f212db0cdb7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"exclude \u003d  .venv,.git,.tox,dist,doc,*lib/python*,*egg,build"},{"line_number":98,"context_line":"import-order-style \u003d pep8"},{"line_number":99,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":100,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":101,"context_line":"max-complexity\u003d19"},{"line_number":102,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":103,"context_line":"# [H203] Use assertIs(Not)None to check for None."}],"source_content_type":"text/x-properties","patch_set":32,"id":"1a1ced50_1d3a8ccc","line":100,"in_reply_to":"9a30ddce_8a54b921","updated":"2017-03-21 19:16:54.000000000","message":"Yup...","commit_id":"1f64722c0aea938e31ee349d83c43a67e0f24422"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ecfbf97b5c89dd20e3c0517ae4d03047a9f7f87a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"exclude \u003d  .venv,.git,.tox,dist,doc,*lib/python*,*egg,build"},{"line_number":100,"context_line":"import-order-style \u003d pep8"},{"line_number":101,"context_line":"application-import-names \u003d ironic"},{"line_number":102,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":103,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":104,"context_line":"max-complexity\u003d19"},{"line_number":105,"context_line":"# [H106] Don’t put vim configuration in source files."}],"source_content_type":"text/x-properties","patch_set":39,"id":"bff0334d_505a6682","line":102,"updated":"2017-04-12 17:26:38.000000000","message":"please, please refactor it here (or prior to this patch) :) I hit the same thing with tags and had to refactor. As next time someone will see it going up from 19 to 20 and decide to bump it, as the difference is not so big.","commit_id":"90f64e212a3213648b1b7249dfeb98708f060647"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"243fcd8a08742092a07498236f941b5553c38ed0","unresolved":false,"context_lines":[{"line_number":103,"context_line":"application-import-names \u003d ironic"},{"line_number":104,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":105,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":106,"context_line":"max-complexity\u003d21"},{"line_number":107,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":108,"context_line":"# [H203] Use assertIs(Not)None to check for None."},{"line_number":109,"context_line":"# [H204] Use assert(Not)Equal to check for equality."}],"source_content_type":"text/x-properties","patch_set":56,"id":"9f5c4f37_1c2c0146","line":106,"updated":"2017-09-21 03:45:21.000000000","message":":( I guess we really need to do that at some point.","commit_id":"9de140ca679b4c10650e9c6ebb3aac83121a9663"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ebd34f429e793fa903e24ed04f0424a8a72e9260","unresolved":false,"context_lines":[{"line_number":106,"context_line":"application-import-names \u003d ironic"},{"line_number":107,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":108,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":109,"context_line":"max-complexity\u003d21"},{"line_number":110,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":111,"context_line":"# [H203] Use assertIs(Not)None to check for None."},{"line_number":112,"context_line":"# [H204] Use assert(Not)Equal to check for equality."}],"source_content_type":"text/x-properties","patch_set":67,"id":"ff82abbf_07b7063c","line":109,"updated":"2017-11-28 23:09:45.000000000","message":"hmm, i hope we clean this up soon...","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"5ae062a2ee0e491149996b7394dc7d3d832095b0","unresolved":false,"context_lines":[{"line_number":106,"context_line":"application-import-names \u003d ironic"},{"line_number":107,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":108,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":109,"context_line":"max-complexity\u003d21"},{"line_number":110,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":111,"context_line":"# [H203] Use assertIs(Not)None to check for None."},{"line_number":112,"context_line":"# [H204] Use assert(Not)Equal to check for equality."}],"source_content_type":"text/x-properties","patch_set":67,"id":"df87a7cf_8e98cc6a","line":109,"in_reply_to":"ff82abbf_07b7063c","updated":"2017-12-03 16:39:51.000000000","message":"yes","commit_id":"30853e5485cfbc2cd9c704f2a9e570ab6dc373d7"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"2f87fe89550845b9c3c8679bd73a670e1d27f5d6","unresolved":false,"context_lines":[{"line_number":107,"context_line":"application-import-names \u003d ironic"},{"line_number":108,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":109,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":110,"context_line":"max-complexity\u003d21"},{"line_number":111,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":112,"context_line":"# [H203] Use assertIs(Not)None to check for None."},{"line_number":113,"context_line":"# [H204] Use assert(Not)Equal to check for equality."}],"source_content_type":"text/x-properties","patch_set":73,"id":"bf8cb3f7_c591939b","line":110,"range":{"start_line":110,"start_character":15,"end_line":110,"end_character":17},"updated":"2017-12-27 04:11:16.000000000","message":"It seems that 20 is enough.","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e6e466d9d79372c481d422149d5edbe28a27963c","unresolved":false,"context_lines":[{"line_number":107,"context_line":"application-import-names \u003d ironic"},{"line_number":108,"context_line":"# TODO(JayF): To reduce the max-complexity, refactor:"},{"line_number":109,"context_line":"# ironic.api.controllers.v1.node.NodeStatesController.provision"},{"line_number":110,"context_line":"max-complexity\u003d21"},{"line_number":111,"context_line":"# [H106] Don’t put vim configuration in source files."},{"line_number":112,"context_line":"# [H203] Use assertIs(Not)None to check for None."},{"line_number":113,"context_line":"# [H204] Use assert(Not)Equal to check for equality."}],"source_content_type":"text/x-properties","patch_set":73,"id":"9f91af0f_95f96bc9","line":110,"range":{"start_line":110,"start_character":15,"end_line":110,"end_character":17},"in_reply_to":"bf8cb3f7_c591939b","updated":"2018-01-06 14:52:54.000000000","message":"Done","commit_id":"a8a3f65deb420f32f7c926811cd250ee1da72d63"}]}
