)]}'
{"specs/juno/support-decommissioning-of-nodes.rst":[{"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":"3386b456d1b51f4b611f91618713c76a9b9c8235","unresolved":false,"context_lines":[{"line_number":14,"context_line":"run a set of decommissioning tools and commands during tear down. In order"},{"line_number":15,"context_line":"to avoid nodes being stuck in a user\u0027s node list as \"DELETING\" for"},{"line_number":16,"context_line":"potentially hours, new states will be introduced between DELETED and"},{"line_number":17,"context_line":"NOSTATE, and Nova will return the node as deleted to the user as soon as"},{"line_number":18,"context_line":"the node enters these states. Decom will give the driver control over the"},{"line_number":19,"context_line":"order of operations and list of required operations in a new decommission()"},{"line_number":20,"context_line":"function called after tear_down. The driver can then make calls to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_ec174e44","line":17,"updated":"2014-06-26 21:44:14.000000000","message":"Will nova need a separate spec for the update to the ironic driver?","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"3b499adef9b879ff7e43f074efd47fe7a3ec1a75","unresolved":false,"context_lines":[{"line_number":14,"context_line":"run a set of decommissioning tools and commands during tear down. In order"},{"line_number":15,"context_line":"to avoid nodes being stuck in a user\u0027s node list as \"DELETING\" for"},{"line_number":16,"context_line":"potentially hours, new states will be introduced between DELETED and"},{"line_number":17,"context_line":"NOSTATE, and Nova will return the node as deleted to the user as soon as"},{"line_number":18,"context_line":"the node enters these states. Decom will give the driver control over the"},{"line_number":19,"context_line":"order of operations and list of required operations in a new decommission()"},{"line_number":20,"context_line":"function called after tear_down. The driver can then make calls to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_6ce25ed5","line":17,"in_reply_to":"1ae5cdf2_ec174e44","updated":"2014-06-26 22:03:03.000000000","message":"It shouldn\u0027t, no. It is a very minor change and really just a performance/user experience optimization.","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"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":"3386b456d1b51f4b611f91618713c76a9b9c8235","unresolved":false,"context_lines":[{"line_number":30,"context_line":"  there should be some work done to it to ensure it is ready for another"},{"line_number":31,"context_line":"  workload."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"* At a minimum, hard drives should be erased."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"* Other potentially useful tasks would be firmware updates, resetting BIOS,"},{"line_number":36,"context_line":"  ensuring the clock is correct, and others."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_ece10e2c","line":33,"updated":"2014-06-26 21:44:14.000000000","message":"For --preserve-ephemeral we shouldn\u0027t secure erase everything. IMO decom should be a noop if a driver chooses that. (I\u0027d never run said theoretical driver, but still :D)","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"3b499adef9b879ff7e43f074efd47fe7a3ec1a75","unresolved":false,"context_lines":[{"line_number":30,"context_line":"  there should be some work done to it to ensure it is ready for another"},{"line_number":31,"context_line":"  workload."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"* At a minimum, hard drives should be erased."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"* Other potentially useful tasks would be firmware updates, resetting BIOS,"},{"line_number":36,"context_line":"  ensuring the clock is correct, and others."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_4ca5a2b3","line":33,"in_reply_to":"1ae5cdf2_ece10e2c","updated":"2014-06-26 22:03:03.000000000","message":"Good point. I\u0027ll update accordingly.","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"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":"3386b456d1b51f4b611f91618713c76a9b9c8235","unresolved":false,"context_lines":[{"line_number":33,"context_line":"* At a minimum, hard drives should be erased."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"* Other potentially useful tasks would be firmware updates, resetting BIOS,"},{"line_number":36,"context_line":"  ensuring the clock is correct, and others."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Users will expect each baremetal node to be the same. Applying these"},{"line_number":39,"context_line":"  baseline tasks will ensure a smoother experience for end users."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_ccbff2fa","line":36,"updated":"2014-06-26 21:44:14.000000000","message":"Setting BIOS configs is something our use case requires, and others have mentioned as well (like flipping VT bits on and off)","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"3b499adef9b879ff7e43f074efd47fe7a3ec1a75","unresolved":false,"context_lines":[{"line_number":33,"context_line":"* At a minimum, hard drives should be erased."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"* Other potentially useful tasks would be firmware updates, resetting BIOS,"},{"line_number":36,"context_line":"  ensuring the clock is correct, and others."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Users will expect each baremetal node to be the same. Applying these"},{"line_number":39,"context_line":"  baseline tasks will ensure a smoother experience for end users."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_6c7dfe1d","line":36,"in_reply_to":"1ae5cdf2_ccbff2fa","updated":"2014-06-26 22:03:03.000000000","message":"I believe BIOS config being added to the management interface is covered in another spec currently. https://review.openstack.org/#/c/101122/. Adding to spec (mentioned in dependencies below)","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"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":"3386b456d1b51f4b611f91618713c76a9b9c8235","unresolved":false,"context_lines":[{"line_number":52,"context_line":"* This will likely require either the Ironic Python Agent or a BMC"},{"line_number":53,"context_line":"  capable of doing the required actions out of band. The current PXE ramdisk"},{"line_number":54,"context_line":"  would need to be upgraded to support operations like erase_device() or"},{"line_number":55,"context_line":"  apply_firmware() as these can\u0027t be done over iSCSI."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Proposed change"},{"line_number":58,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_8c416a0c","line":55,"updated":"2014-06-26 21:44:14.000000000","message":"A good reason why a driver should be able to have decom be a noop.","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"3b499adef9b879ff7e43f074efd47fe7a3ec1a75","unresolved":false,"context_lines":[{"line_number":52,"context_line":"* This will likely require either the Ironic Python Agent or a BMC"},{"line_number":53,"context_line":"  capable of doing the required actions out of band. The current PXE ramdisk"},{"line_number":54,"context_line":"  would need to be upgraded to support operations like erase_device() or"},{"line_number":55,"context_line":"  apply_firmware() as these can\u0027t be done over iSCSI."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Proposed change"},{"line_number":58,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_8cfeca68","line":55,"in_reply_to":"1ae5cdf2_8c416a0c","updated":"2014-06-26 22:03:03.000000000","message":"Definitely. And I think any driver can easily noop this. Just like the agent driver doesn\u0027t implement take_over or clean_up.","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"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":"3386b456d1b51f4b611f91618713c76a9b9c8235","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"* Add DECOMMISSIONING AND DECOMMISSIONED to the list of states."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Make the Nova Virt Driver look for DECOMMISSIONING in"},{"line_number":68,"context_line":"  _wait_for_provision_state() so the node can be removed from a users list"},{"line_number":69,"context_line":"  of active nodes more quickly."},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_4c6202ae","line":67,"updated":"2014-06-26 21:44:14.000000000","message":"this probably belongs in a nova spec :x","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"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":"3386b456d1b51f4b611f91618713c76a9b9c8235","unresolved":false,"context_lines":[{"line_number":199,"context_line":"  JoshNang"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"Other contributors:"},{"line_number":202,"context_line":"  jroll"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"Work Items"},{"line_number":205,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_6c0a5ed2","line":202,"updated":"2014-06-26 21:44:14.000000000","message":"feel free to add me here as I\u0027m sure I\u0027ll end up implementing some of the basic stuff in the agent","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"3b499adef9b879ff7e43f074efd47fe7a3ec1a75","unresolved":false,"context_lines":[{"line_number":199,"context_line":"  JoshNang"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"Other contributors:"},{"line_number":202,"context_line":"  jroll"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"Work Items"},{"line_number":205,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_8ce7aae2","line":202,"in_reply_to":"1ae5cdf2_6c0a5ed2","updated":"2014-06-26 22:03:03.000000000","message":"Can do!","commit_id":"d7b92f123d543ea938a59ad8e43cbcc61b16416c"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"4c44dce8e16243ad8a9ef8bb7e7c434dd0365802","unresolved":false,"context_lines":[{"line_number":20,"context_line":"function called after tear_down. The driver can then make calls to"},{"line_number":21,"context_line":"ManagementInterface functions or send commands to the ramdisk agent to"},{"line_number":22,"context_line":"perform tasks such as firmware updates, reset BIOS settings, erase disks,"},{"line_number":23,"context_line":"and other tasks."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_e7df69d5","line":23,"updated":"2014-06-26 22:56:42.000000000","message":"I would move everything here, except the first sentence, to \"proposed change\", as it discusses the implementation.","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"392e297e7e93ed41c9dea673e58ef432259049a2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"function called after tear_down. The driver can then make calls to"},{"line_number":21,"context_line":"ManagementInterface functions or send commands to the ramdisk agent to"},{"line_number":22,"context_line":"perform tasks such as firmware updates, reset BIOS settings, erase disks,"},{"line_number":23,"context_line":"and other tasks."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_428c8b35","line":23,"in_reply_to":"1ae5cdf2_e7df69d5","updated":"2014-06-26 23:11:39.000000000","message":"Done","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"4c44dce8e16243ad8a9ef8bb7e7c434dd0365802","unresolved":false,"context_lines":[{"line_number":134,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":137,"context_line":"  time and could possibly time out in unprovision. This would only happen if"},{"line_number":138,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":139,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":140,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_62c5078f","line":137,"updated":"2014-06-26 22:56:42.000000000","message":"IMO, s/could possibly/will likely/","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"392e297e7e93ed41c9dea673e58ef432259049a2","unresolved":false,"context_lines":[{"line_number":134,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":137,"context_line":"  time and could possibly time out in unprovision. This would only happen if"},{"line_number":138,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":139,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":140,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_829f7301","line":137,"in_reply_to":"1ae5cdf2_62c5078f","updated":"2014-06-26 23:11:39.000000000","message":"Done","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"4c44dce8e16243ad8a9ef8bb7e7c434dd0365802","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"* External event callback API would be helpful for the Agent driver (and"},{"line_number":231,"context_line":"  probably others\u0027) implementation of decommission:"},{"line_number":232,"context_line":"  https://review.openstack.org/#/c/99770/"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Testing"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_222bff33","line":232,"updated":"2014-06-26 22:56:42.000000000","message":"Might mention that these dependencies do not block this work.","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"392e297e7e93ed41c9dea673e58ef432259049a2","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"* External event callback API would be helpful for the Agent driver (and"},{"line_number":231,"context_line":"  probably others\u0027) implementation of decommission:"},{"line_number":232,"context_line":"  https://review.openstack.org/#/c/99770/"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Testing"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_228e9f27","line":232,"in_reply_to":"1ae5cdf2_222bff33","updated":"2014-06-26 23:11:39.000000000","message":"Done","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"4c44dce8e16243ad8a9ef8bb7e7c434dd0365802","unresolved":false,"context_lines":[{"line_number":236,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* Drivers implementing decommissioning will be expected to test their added"},{"line_number":239,"context_line":"  features."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_6221874e","line":239,"updated":"2014-06-26 22:56:42.000000000","message":"Probably want tempest tests as well.","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"392e297e7e93ed41c9dea673e58ef432259049a2","unresolved":false,"context_lines":[{"line_number":236,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* Drivers implementing decommissioning will be expected to test their added"},{"line_number":239,"context_line":"  features."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_62942736","line":239,"in_reply_to":"1ae5cdf2_6221874e","updated":"2014-06-26 23:11:39.000000000","message":"Done","commit_id":"1d170d1589dd005b7bd114fca0d7d7ce816e52ca"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"* Other potentially useful tasks would be firmware updates, resetting BIOS,"},{"line_number":28,"context_line":"  ensuring the clock is correct, and others. Some of these are covered in a"},{"line_number":29,"context_line":"  separate spec: https://review.openstack.org/#/c/101122/."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"* Users will expect each baremetal node to be the same. Applying these"},{"line_number":32,"context_line":"  baseline tasks will ensure a smoother experience for end users."}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_9998656c","line":29,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen: https://review.openstack.org/#/c/100842/ covers firmware update and management Interface for firmware update.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"* Other potentially useful tasks would be firmware updates, resetting BIOS,"},{"line_number":28,"context_line":"  ensuring the clock is correct, and others. Some of these are covered in a"},{"line_number":29,"context_line":"  separate spec: https://review.openstack.org/#/c/101122/."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"* Users will expect each baremetal node to be the same. Applying these"},{"line_number":32,"context_line":"  baseline tasks will ensure a smoother experience for end users."}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_476b4385","line":29,"in_reply_to":"baada198_9998656c","updated":"2014-07-08 22:25:31.000000000","message":"Right, I talked to Anusha Ramineni in the comments already and am going to remove that bit from the spec.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":36,"context_line":"  on a driver basis."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* There is insufficient support in place in Ironic for some of these tasks,"},{"line_number":39,"context_line":"  such as applying a firmware update which requires a power cycle."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* Deployers could use these functions to prepare newly added nodes and set"},{"line_number":42,"context_line":"  them at the same baseline configuration as existing nodes after they have"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_797d51e7","line":39,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen: ditto for fimrware update spec https://review.openstack.org/#/c/100842/","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":36,"context_line":"  on a driver basis."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* There is insufficient support in place in Ironic for some of these tasks,"},{"line_number":39,"context_line":"  such as applying a firmware update which requires a power cycle."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* Deployers could use these functions to prepare newly added nodes and set"},{"line_number":42,"context_line":"  them at the same baseline configuration as existing nodes after they have"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_67684788","line":39,"in_reply_to":"baada198_797d51e7","updated":"2014-07-08 22:25:31.000000000","message":"Done","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":45,"context_line":"* This will likely require either the Ironic Python Agent or a BMC"},{"line_number":46,"context_line":"  capable of doing the required actions out of band. The current PXE ramdisk"},{"line_number":47,"context_line":"  would need to be upgraded to support operations like erase_device() or"},{"line_number":48,"context_line":"  apply_firmware() as these can\u0027t be done over iSCSI."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Proposed change"},{"line_number":51,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_d9001d38","line":48,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen: in-band agent will need to add the de-commisioning actions to ramdisk. Drivers that support out-of-band de-commission can just do it using oob BMC capabilities.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"28d47503ae51a56098202a62af31b5b4da3b9f44","unresolved":false,"context_lines":[{"line_number":45,"context_line":"* This will likely require either the Ironic Python Agent or a BMC"},{"line_number":46,"context_line":"  capable of doing the required actions out of band. The current PXE ramdisk"},{"line_number":47,"context_line":"  would need to be upgraded to support operations like erase_device() or"},{"line_number":48,"context_line":"  apply_firmware() as these can\u0027t be done over iSCSI."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Proposed change"},{"line_number":51,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_8c685bf6","line":48,"in_reply_to":"baada198_67ff67ab","updated":"2014-07-15 00:14:59.000000000","message":"What I was trying to say earlier was that some BMC maybe able to do the decommision work out-of-band without ramdisk.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":45,"context_line":"* This will likely require either the Ironic Python Agent or a BMC"},{"line_number":46,"context_line":"  capable of doing the required actions out of band. The current PXE ramdisk"},{"line_number":47,"context_line":"  would need to be upgraded to support operations like erase_device() or"},{"line_number":48,"context_line":"  apply_firmware() as these can\u0027t be done over iSCSI."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Proposed change"},{"line_number":51,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_67ff67ab","line":48,"in_reply_to":"baada198_d9001d38","updated":"2014-07-08 22:25:31.000000000","message":"The IPA will support decommissioning. The current deploy ramdisk may be able to support it as well, but that would be a lot of duplicated work.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":54,"context_line":"  will call to the management interface and/or make calls to the ramdisk"},{"line_number":55,"context_line":"  agent to decommission a node. It will be called by the conductor after"},{"line_number":56,"context_line":"  tear_down. This will give the driver control over the order of operations"},{"line_number":57,"context_line":"  and list of required operations. decom"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* Add DECOMMISSIONING AND DECOMMISSIONED to the list of states,"},{"line_number":60,"context_line":"  which occurs between DELETED and NOSTATE. This will prevent nova delete"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_7fed3125","line":57,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen:  Some of the functions such as firmware update and firmware settings are useful not only during de-commission.  For instance, to apply a secuirty firmware patch or to set boot mode for the next boot.  So, I am thinking it would be useful to add seperate Ironic API and management API for these functions.\r\n\r\nAlso, although it could be a good practice, firmware update may not be needed for every re-deployment or users may choose not to do firmware update.  So, is firmware update optional for node de-commissioning?","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":54,"context_line":"  will call to the management interface and/or make calls to the ramdisk"},{"line_number":55,"context_line":"  agent to decommission a node. It will be called by the conductor after"},{"line_number":56,"context_line":"  tear_down. This will give the driver control over the order of operations"},{"line_number":57,"context_line":"  and list of required operations. decom"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* Add DECOMMISSIONING AND DECOMMISSIONED to the list of states,"},{"line_number":60,"context_line":"  which occurs between DELETED and NOSTATE. This will prevent nova delete"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_c7af537c","line":57,"in_reply_to":"baada198_7fed3125","updated":"2014-07-08 22:25:31.000000000","message":"I\u0027m removing the firmware bit. That\u0027ll be up to drivers to implement in their decommission(). \n\nSo, checking will be up to the drivers. I\u0027d recommend they don\u0027t attempt to apply a firmware again in the interest of time. The way we have it implemented in our hardware manager [1] is attempting to apply each firmware but only actually applying if the versions are different (which is included in the firmware update tools we\u0027re using). I think a more generic way of doing this would be helpful.\n\nI\u0027d say each driver that implements decommissioning should implement the minimum that should be run on *every* delete (with some conditional logic), and if extra needs to be ran, it can be either be done via maintenance or out of band. I think that is the most cloud-like behavior.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"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":"62e9e78d33b0ea72c917492b6ee4fffe28342c85","unresolved":false,"context_lines":[{"line_number":68,"context_line":"  driver_info for the node to coordinate reboots and give insight into"},{"line_number":69,"context_line":"  decommission tasks so nodes aren\u0027t rebooted while applying firmware."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface. This"},{"line_number":72,"context_line":"  will call to the agent or BMC to apply a device firmware."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface. This will"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_8749f08d","line":71,"updated":"2014-06-30 16:43:08.000000000","message":"After this task, or any other task that impacts BIOS settings or version, we should re-perform the IPMI tasks required to set bootdevice as in my testing, I\u0027ve seen the boot device revert to the default (PXE in most cases)","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":68,"context_line":"  driver_info for the node to coordinate reboots and give insight into"},{"line_number":69,"context_line":"  decommission tasks so nodes aren\u0027t rebooted while applying firmware."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface. This"},{"line_number":72,"context_line":"  will call to the agent or BMC to apply a device firmware."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface. This will"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_3f4579b3","line":71,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen:  : https://review.openstack.org/#/c/100842/ proposes  get_firmware_list and update_firmware management Interface.  Can we consllidate all firmware update APIs and Management Interface  into a standard set?   It would be better to have one single standard firmware update management interface than two of them.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"11179c3f0db7a349a1775635737873e74ecbe7a5","unresolved":false,"context_lines":[{"line_number":68,"context_line":"  driver_info for the node to coordinate reboots and give insight into"},{"line_number":69,"context_line":"  decommission tasks so nodes aren\u0027t rebooted while applying firmware."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface. This"},{"line_number":72,"context_line":"  will call to the agent or BMC to apply a device firmware."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface. This will"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_55093b94","line":71,"in_reply_to":"baada198_8749f08d","updated":"2014-07-02 16:56:38.000000000","message":"That should be up to the driver to implement. But yes, I\u0027ll do that in the agent driver patch.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"b899047efa103907e03fdb0f03c4414a46c35e36","unresolved":false,"context_lines":[{"line_number":69,"context_line":"  decommission tasks so nodes aren\u0027t rebooted while applying firmware."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface. This"},{"line_number":72,"context_line":"  will call to the agent or BMC to apply a device firmware."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface. This will"},{"line_number":75,"context_line":"  call to the agent or BMC to erase a disk."}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_aa552dfb","line":72,"updated":"2014-07-07 03:54:36.000000000","message":"What if apply_firmware call fails for some reason , is there a way admin knows about it ? does some state can be reflected in node DB?","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"14e1110940662ed1f2688ccadb6d3ea89b5237f2","unresolved":false,"context_lines":[{"line_number":69,"context_line":"  decommission tasks so nodes aren\u0027t rebooted while applying firmware."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface. This"},{"line_number":72,"context_line":"  will call to the agent or BMC to apply a device firmware."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface. This will"},{"line_number":75,"context_line":"  call to the agent or BMC to erase a disk."}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_50686287","line":72,"in_reply_to":"baada198_aa552dfb","updated":"2014-07-08 18:04:46.000000000","message":"The node.provision_state would go to states.ERROR and node.last_error would reflect the firmware error.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"* The drivers could implement this in tear_down only and only using out of"},{"line_number":81,"context_line":"  band management. It would be slower from a user perspective and unable to do"},{"line_number":82,"context_line":"  utilize the agent driver to do anything that requires a reboot."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* Most of these actions could be taken during deploy. This would"},{"line_number":85,"context_line":"  significantly lengthen the amount of time to deploy in some cases"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_711645f3","line":82,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen: not quite understand this statement.  I think both  in-band and OOB managment have their own use cases.  Most of the OOB managment functons can be performed with zero to 1 reboot irregardless OS has been deployed or not.  Therefore, users can perform management functions more freely than just perform them during node de-commissioning.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"* The drivers could implement this in tear_down only and only using out of"},{"line_number":81,"context_line":"  band management. It would be slower from a user perspective and unable to do"},{"line_number":82,"context_line":"  utilize the agent driver to do anything that requires a reboot."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* Most of these actions could be taken during deploy. This would"},{"line_number":85,"context_line":"  significantly lengthen the amount of time to deploy in some cases"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_e7ba976d","line":82,"in_reply_to":"baada198_711645f3","updated":"2014-07-08 22:25:31.000000000","message":"This spec is only for things that need to happen between workloads. And if you don\u0027t have a decommission interface supported by the driver, you\u0027re stuck with the things you can currently do in Ironic, which doesn\u0027t currently support things like erasing disks (but could include OOB things implemented by the ManagementInterface). Things like erasing disks you can only do during tear_down/decommission. And if you have a big spinning disk server, erasing the disks is going to take a long time. The only places you could do it right now are tear_down (which would lead to Nova timeouts even if you cranked those timeouts way up, it would show the node as DELETING in the user\u0027s node list for hours).","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"713791d58ff2fd432fe67fc466a0f451d80afb19","unresolved":false,"context_lines":[{"line_number":93,"context_line":"REST API impact"},{"line_number":94,"context_line":"---------------"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"None"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Driver API impact"},{"line_number":99,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_a128b633","line":96,"updated":"2014-07-08 00:10:42.000000000","message":"We should change the API for nodes/uuid/states/power, to not allow state changes while something is in decom mode.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"14e1110940662ed1f2688ccadb6d3ea89b5237f2","unresolved":false,"context_lines":[{"line_number":93,"context_line":"REST API impact"},{"line_number":94,"context_line":"---------------"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"None"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Driver API impact"},{"line_number":99,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_308f6e77","line":96,"in_reply_to":"baada198_a128b633","updated":"2014-07-08 18:04:46.000000000","message":"Yes, definitely. I\u0027ll update.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"* erase_device(task, device, kwargs) will be added to the ManagementInterface"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"* apply_firmware(task, device, kwargs) will be added to the"},{"line_number":107,"context_line":"  ManagementInterface"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"* I don\u0027t believe this can be supported in the current PXE driver,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_b18c5d37","line":106,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen: ditto for fimrware update spec https://review.openstack.org/#/c/100842/","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"* I don\u0027t believe this can be supported in the current PXE driver,"},{"line_number":110,"context_line":"  only the agent driver and drivers with hardware BMC support, such as iLO."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":113,"context_line":"  expected to test their implementation thoroughly."},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_f13fb5d4","line":111,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen:  My understanding is that firmware update could be vendor specific.  So, is IPA going to provide a plugin interface for vendor to plug in their firmware update tools to perform firmware update?  I think we need a corresponding IPA spec for the plugin interface.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"28d47503ae51a56098202a62af31b5b4da3b9f44","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"* I don\u0027t believe this can be supported in the current PXE driver,"},{"line_number":110,"context_line":"  only the agent driver and drivers with hardware BMC support, such as iLO."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":113,"context_line":"  expected to test their implementation thoroughly."},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_8c4f7b91","line":111,"in_reply_to":"baada198_e73ff7d4","updated":"2014-07-15 00:14:59.000000000","message":"Wan-yen: Thanks for the info and links.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"* I don\u0027t believe this can be supported in the current PXE driver,"},{"line_number":110,"context_line":"  only the agent driver and drivers with hardware BMC support, such as iLO."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":113,"context_line":"  expected to test their implementation thoroughly."},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_e73ff7d4","line":111,"in_reply_to":"baada198_f13fb5d4","updated":"2014-07-08 22:25:31.000000000","message":"It already does in the form of the HardwareManager. So if a deployer is using the IPA, they\u0027d need to build their own with some plugins. I\u0027d expect a lot of the vendors will create their own customized IPAs with the tools already embedded. HardwareManager:\nhttps://github.com/openstack/ironic-python-agent/blob/master/ironic_python_agent/hardware.py#L86\n\nHere\u0027s a patch massively expanding the things you can do during the decom state. https://review.openstack.org/#/c/104379/. \n\nAnd for OnMetal, here\u0027s our hardware manager: https://github.com/rackerlabs/onmetal-ironic-hardware-manager (still be finished).","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":126,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":127,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":128,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":129,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Security impact"},{"line_number":132,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_34911b53","line":129,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen:  Can you educate me how Nova or Ironic get updated 1st?  Is there some sort of race condition?\r\nWhat if a node times out in urprovision?  Any remedy or retry/recovery for it?","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":126,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":127,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":128,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":129,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Security impact"},{"line_number":132,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_0a95d287","line":129,"in_reply_to":"baada198_34911b53","updated":"2014-07-08 22:25:31.000000000","message":"When deploying large infrastructure and attempting little downtime, it is feasible someone may update their Ironic cluster before their Nova cluster, meaning you\u0027d have a Ironic cluster with decommissioning enabled but the Nova logic to allow for long decommissions wouldn\u0027t be yet enabled. If someone deleted a node in that time frame, it would attempt the long decommission and Nova would time out.\n\nSure, the timed out nodes would need to be deleted again. \n\nI think we can mitigate this with documentation.","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"31c8b547de1dc4b209ca6e99fbdb46ada259275c","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"* Add Nova driver support"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface."},{"line_number":209,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_103391ab","line":206,"updated":"2014-07-07 04:02:56.000000000","message":"what does device mean here? Is it not better to add firmware_url to the arguments?","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"14e1110940662ed1f2688ccadb6d3ea89b5237f2","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"* Add Nova driver support"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface."},{"line_number":209,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_1047ca1e","line":206,"in_reply_to":"baada198_103391ab","updated":"2014-07-08 18:04:46.000000000","message":"A device identifier. I\u0027ll leave it up to the individual driver for how to implement device matching. In the Ironic Python Agent, there is a concept of a hardware manager plugin, which would do the matching.\n\nThat\u0027s what I left kwargs for. If you want to pass in a URL, there driver could implement that. But I don\u0027t think it should be required. For example, in the Ironic Python Agent, there will be an option to package the firmwares into the agent (easier for homogenous environments).","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"c72b2de9aba955c4f7b0faa5556aaa7dcfbaac19","unresolved":false,"context_lines":[{"line_number":204,"context_line":"* Add Nova driver support"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"* Add apply_firmware(task, device, kwargs) to Management Interface."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"* Add erase_device(task, device, kwargs) to Management Interface."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_d4e61fe8","line":207,"updated":"2014-07-08 21:38:36.000000000","message":"Wan-yen: ditto for fimrware update spec https://review.openstack.org/#/c/100842/","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c126646ce4c8b4be7514b746a197ceadbf552b36","unresolved":false,"context_lines":[{"line_number":235,"context_line":"Documentation Impact"},{"line_number":236,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"The management interface and API will need to be documented."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_eaa97ee0","line":238,"updated":"2014-07-08 22:25:31.000000000","message":"A note about updating Ironic before Nova would be helpful (referenced above in Nova Driver Impact)","commit_id":"5c911c1962333bf67fcee35cbbf2984ae7005feb"}],"specs/kilo/implement-cleaning-states.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c33fb2bf53b5684f429ee7fd12b95ca2e81b9e09","unresolved":false,"context_lines":[{"line_number":59,"context_line":"* Add a decorator `@clean_step(priority)` to decorate steps that"},{"line_number":60,"context_line":"  should be run as a part of CLEANING. priority is the order in which the"},{"line_number":61,"context_line":"  step will be run, starting from 1. E.g. a function with priority 1 will run"},{"line_number":62,"context_line":"  first, then a step with priority 10, etc. If priority is set to 0, the step"},{"line_number":63,"context_line":"  will not be executed. The argument should be a config option,e.g."},{"line_number":64,"context_line":"  `priority\u003dCONF.$driver.$stepname_priority` to"},{"line_number":65,"context_line":"  give the operator more control over the order steps run in (if at all)."}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_697fa515","line":62,"updated":"2014-12-12 16:08:02.000000000","message":"maybe a nit, but still: it\u0027s a bit vague that the less is priority the earlier something happens. I usually expect something with high priority to be served \u003d to execute earlier. Especially since tasks with the lowers priority won\u0027t be executed at all :)","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":59,"context_line":"* Add a decorator `@clean_step(priority)` to decorate steps that"},{"line_number":60,"context_line":"  should be run as a part of CLEANING. priority is the order in which the"},{"line_number":61,"context_line":"  step will be run, starting from 1. E.g. a function with priority 1 will run"},{"line_number":62,"context_line":"  first, then a step with priority 10, etc. If priority is set to 0, the step"},{"line_number":63,"context_line":"  will not be executed. The argument should be a config option,e.g."},{"line_number":64,"context_line":"  `priority\u003dCONF.$driver.$stepname_priority` to"},{"line_number":65,"context_line":"  give the operator more control over the order steps run in (if at all)."}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_aaf6d88c","line":62,"in_reply_to":"3a961159_697fa515","updated":"2014-12-12 19:02:30.000000000","message":"I\u0027m definitely ok flipping it, and I think that makes sense. I was emulating how sysvinit does startup services, with lowest first.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c33fb2bf53b5684f429ee7fd12b95ca2e81b9e09","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Add a new function `get_clean_steps()` to the BaseDriver class. The"},{"line_number":68,"context_line":"  base implementation will get a list of functions decorated with"},{"line_number":69,"context_line":"  `@clean_step`, determine which are enabled, and then return a list of"},{"line_number":70,"context_line":"  dictionaries representing each step, sorted by priority."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"* The return value of `get_clean_steps()` will be a list of dicts"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_69cde565","line":69,"updated":"2014-12-12 16:08:02.000000000","message":"you probably meant \u0027list of methods\u0027? if so, will they be searched on the class itself only or on interfaces as well?","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Add a new function `get_clean_steps()` to the BaseDriver class. The"},{"line_number":68,"context_line":"  base implementation will get a list of functions decorated with"},{"line_number":69,"context_line":"  `@clean_step`, determine which are enabled, and then return a list of"},{"line_number":70,"context_line":"  dictionaries representing each step, sorted by priority."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"* The return value of `get_clean_steps()` will be a list of dicts"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_2565b9b4","line":69,"in_reply_to":"3a961159_69cde565","updated":"2014-12-12 19:02:30.000000000","message":"I meant the interface here, No, I meant a list of dictionary representations of the steps. This is much more flexible than directly calling the methods. In the agent driver\u0027s case, it\u0027s proxying the info to the agent, and running the steps on the agent.\n\nBlah, I guess I didn\u0027t look hard enough at base.py. I (wrongly) assumed all the interfaces shared a common base class. I meant this method (and execute_clean_step) would be on the interfaces, not the driver.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c33fb2bf53b5684f429ee7fd12b95ca2e81b9e09","unresolved":false,"context_lines":[{"line_number":70,"context_line":"  dictionaries representing each step, sorted by priority."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"* The return value of `get_clean_steps()` will be a list of dicts"},{"line_number":73,"context_line":"  in the form:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"  Clean Step:"},{"line_number":76,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_09e461df","line":73,"updated":"2014-12-12 16:08:02.000000000","message":"let us use namedtuple instead of a dict with pre-defined structure?","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":70,"context_line":"  dictionaries representing each step, sorted by priority."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"* The return value of `get_clean_steps()` will be a list of dicts"},{"line_number":73,"context_line":"  in the form:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"  Clean Step:"},{"line_number":76,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_450c8594","line":73,"in_reply_to":"3a961159_09e461df","updated":"2014-12-12 19:02:30.000000000","message":"I\u0027m ok with namedtuple..I can\u0027t think of any reason they\u0027ll need to be mutable.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"0d18dc48aebfac8bf8670f951b3c3e08102a8917","unresolved":false,"context_lines":[{"line_number":117,"context_line":"* Make the Nova Virt Driver look for CLEANING, CLEANED, and CLEANFAIL states"},{"line_number":118,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"},{"line_number":119,"context_line":"  of active nodes more quickly. Failures to clean should not be"},{"line_number":120,"context_line":"  errors for the user and need to be resolved by an operator."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* If a clean fails, the node will be put into CLEANFAIL state,"},{"line_number":123,"context_line":"  have last_error set appropriately, and be put into maintenance."}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_e78fa773","line":120,"updated":"2014-12-18 01:32:02.000000000","message":"So need a seperate spec for nova virt driver changes to support this spec.  Has it been filed?","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"08b86fbdf1af96af68a213569497d34653ab089f","unresolved":false,"context_lines":[{"line_number":117,"context_line":"* Make the Nova Virt Driver look for CLEANING, CLEANED, and CLEANFAIL states"},{"line_number":118,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"},{"line_number":119,"context_line":"  of active nodes more quickly. Failures to clean should not be"},{"line_number":120,"context_line":"  errors for the user and need to be resolved by an operator."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* If a clean fails, the node will be put into CLEANFAIL state,"},{"line_number":123,"context_line":"  have last_error set appropriately, and be put into maintenance."}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_4250690a","line":120,"in_reply_to":"3a961159_e78fa773","updated":"2014-12-18 01:41:04.000000000","message":"I don\u0027t think we need a spec for what amounts to a couple line change (might actually be a single line).","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"56ef33470afd4cf5a973e3f4459249e8ab1f4ed7","unresolved":false,"context_lines":[{"line_number":147,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":150,"context_line":"  node.driver_info."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"REST API impact"},{"line_number":153,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_6f38a9ef","line":150,"updated":"2014-12-11 23:07:34.000000000","message":"if this is temporary data I may suggest node.extra to store the info vs driver_info","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"0d18dc48aebfac8bf8670f951b3c3e08102a8917","unresolved":false,"context_lines":[{"line_number":147,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":150,"context_line":"  node.driver_info."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"REST API impact"},{"line_number":153,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_275e0fea","line":150,"in_reply_to":"3a961159_057d1de8","updated":"2014-12-18 01:32:02.000000000","message":"+1 for driver_info.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c33fb2bf53b5684f429ee7fd12b95ca2e81b9e09","unresolved":false,"context_lines":[{"line_number":147,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":150,"context_line":"  node.driver_info."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"REST API impact"},{"line_number":153,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_a9da6d14","line":150,"in_reply_to":"3a961159_6f38a9ef","updated":"2014-12-12 16:08:02.000000000","message":"IIRC Ironic should not tamper with \u0027extra\u0027","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":147,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":150,"context_line":"  node.driver_info."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"REST API impact"},{"line_number":153,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_057d1de8","line":150,"in_reply_to":"3a961159_a9da6d14","updated":"2014-12-12 19:02:30.000000000","message":"Yeah, I\u0027m leaning towards driver_info, as it would be the drivers storing extra info in driver_info, and that seems like the place to do it.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"56ef33470afd4cf5a973e3f4459249e8ab1f4ed7","unresolved":false,"context_lines":[{"line_number":155,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":156,"context_line":"  while the node is in a CLEANING state. A node in CLEANFAIL"},{"line_number":157,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":158,"context_line":"  to restart the node to fix it."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* The API will allow users to put a node directly into cleaning"},{"line_number":161,"context_line":"  provision_state with a POST, the same as how provision state is changed"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_5a84895d","line":158,"updated":"2014-12-11 23:07:34.000000000","message":"will the new state machine handle this. there is on going work to implement the current state machine","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":155,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":156,"context_line":"  while the node is in a CLEANING state. A node in CLEANFAIL"},{"line_number":157,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":158,"context_line":"  to restart the node to fix it."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* The API will allow users to put a node directly into cleaning"},{"line_number":161,"context_line":"  provision_state with a POST, the same as how provision state is changed"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_85282d9b","line":158,"in_reply_to":"3a961159_090b818e","updated":"2014-12-12 19:02:30.000000000","message":"I think this would land in the API, rather than the state machine itself.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c33fb2bf53b5684f429ee7fd12b95ca2e81b9e09","unresolved":false,"context_lines":[{"line_number":155,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":156,"context_line":"  while the node is in a CLEANING state. A node in CLEANFAIL"},{"line_number":157,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":158,"context_line":"  to restart the node to fix it."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* The API will allow users to put a node directly into cleaning"},{"line_number":161,"context_line":"  provision_state with a POST, the same as how provision state is changed"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_090b818e","line":158,"in_reply_to":"3a961159_5a84895d","updated":"2014-12-12 16:08:02.000000000","message":"I think new state machine is not handling power states, is it?","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c33fb2bf53b5684f429ee7fd12b95ca2e81b9e09","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"* An API endpoint should be added to allow operators to see currently"},{"line_number":172,"context_line":"  enabled clean steps and their ordering. This will be a GET endpoint"},{"line_number":173,"context_line":"  at /nodes/\u003cuuid\u003e/cleaning/clean_steps and will return the exact"},{"line_number":174,"context_line":"  data noted above for `get_clean_steps()`, as a JSON document and ordered"},{"line_number":175,"context_line":"  by priority."},{"line_number":176,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_a9f0adc9","line":173,"updated":"2014-12-12 16:08:02.000000000","message":"/nodes/\u003cuuid\u003e/cleaning/steps to remove redudancy","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"* An API endpoint should be added to allow operators to see currently"},{"line_number":172,"context_line":"  enabled clean steps and their ordering. This will be a GET endpoint"},{"line_number":173,"context_line":"  at /nodes/\u003cuuid\u003e/cleaning/clean_steps and will return the exact"},{"line_number":174,"context_line":"  data noted above for `get_clean_steps()`, as a JSON document and ordered"},{"line_number":175,"context_line":"  by priority."},{"line_number":176,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_806bbbb5","line":173,"in_reply_to":"3a961159_a9f0adc9","updated":"2014-12-12 19:02:30.000000000","message":"+1","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"56ef33470afd4cf5a973e3f4459249e8ab1f4ed7","unresolved":false,"context_lines":[{"line_number":172,"context_line":"  enabled clean steps and their ordering. This will be a GET endpoint"},{"line_number":173,"context_line":"  at /nodes/\u003cuuid\u003e/cleaning/clean_steps and will return the exact"},{"line_number":174,"context_line":"  data noted above for `get_clean_steps()`, as a JSON document and ordered"},{"line_number":175,"context_line":"  by priority."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"RPC API impact"},{"line_number":178,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_d63dad2c","line":175,"updated":"2014-12-11 23:07:34.000000000","message":"will the currently active step be noted in this json or will user have to check the node.cleaning_step field?","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":172,"context_line":"  enabled clean steps and their ordering. This will be a GET endpoint"},{"line_number":173,"context_line":"  at /nodes/\u003cuuid\u003e/cleaning/clean_steps and will return the exact"},{"line_number":174,"context_line":"  data noted above for `get_clean_steps()`, as a JSON document and ordered"},{"line_number":175,"context_line":"  by priority."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"RPC API impact"},{"line_number":178,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_207be78c","line":175,"in_reply_to":"3a961159_d63dad2c","updated":"2014-12-12 19:02:30.000000000","message":"I think adding the step that is currently being executed is conflating two different things. I think it makes more sense to return the current step on a GET on provision state or just on a GET on the node resource.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"56ef33470afd4cf5a973e3f4459249e8ab1f4ed7","unresolved":false,"context_lines":[{"line_number":177,"context_line":"RPC API impact"},{"line_number":178,"context_line":"--------------"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"At the end of a tear down, the conductor will call() the clean()"},{"line_number":181,"context_line":"method of the conductor."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"As the states will first be added as no-ops in the new state machine spec,"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_b6274111","line":180,"updated":"2014-12-11 23:07:34.000000000","message":"are \u0027()\u0027 need for the call in this sentence?","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"41690545b61069532bb7d9e7d7d6950273603ed5","unresolved":false,"context_lines":[{"line_number":177,"context_line":"RPC API impact"},{"line_number":178,"context_line":"--------------"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"At the end of a tear down, the conductor will call() the clean()"},{"line_number":181,"context_line":"method of the conductor."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"As the states will first be added as no-ops in the new state machine spec,"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_c01ce36c","line":180,"in_reply_to":"3a961159_b6274111","updated":"2014-12-12 19:02:30.000000000","message":"I was specifying that it\u0027d be a call() RPC method (synchronous) vs cast()","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"0d18dc48aebfac8bf8670f951b3c3e08102a8917","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"As the states will first be added as no-ops in the new state machine spec,"},{"line_number":184,"context_line":"upgrading won\u0027t be a problem."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Driver API impact"},{"line_number":188,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_c7f2ab9a","line":185,"updated":"2014-12-18 01:32:02.000000000","message":"I think we need a section or a seperate spec to define how to standarize meta data needed by cleaning steps, e.g., firmware update (meta data to define firmware version, firmware image path, base firmware setting, etc.) so that drivers and users can use consistent format and representation.","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"08b86fbdf1af96af68a213569497d34653ab089f","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"As the states will first be added as no-ops in the new state machine spec,"},{"line_number":184,"context_line":"upgrading won\u0027t be a problem."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Driver API impact"},{"line_number":188,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3a961159_6712d763","line":185,"in_reply_to":"3a961159_c7f2ab9a","updated":"2014-12-18 01:41:04.000000000","message":"I disagree. It\u0027s going to be very different for different drivers. Like iLo may have those keys, the agent won\u0027t have any (they\u0027ll be in the hardware managers). Some maybe have a firmware update function, others may not. DRAC and iLO will probably be similar, so maybe we can try to get those to match up while reviewing them (or whoever implements first, etc). A general format, I\u0027d think, is $(cleaning_step_name)_$(metadata) in driver_info, e.g. \"upgrade_firmware_version\" and \"upgrade_firmware_path\".","commit_id":"4d58a6f449c0dfda67a8e2c9f7860c39849a49bd"},{"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":"dbdd4a07db9513e538ec813a33ca244447de787a","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Implement Cleaning States"},{"line_number":9,"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\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/ironic/+spec/decom-nodes"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"When a node has finished a workload, drivers should have the opportunity to"},{"line_number":14,"context_line":"run a set of tasks during immediately after tear down and before the node is"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a961159_b8d319d4","line":11,"updated":"2014-12-30 18:36:56.000000000","message":"I\u0027m confused by this somewhat; the name of the spec is supposed to match the name of the blueprint and the filename. In this case it\u0027s obvious the blueprint is wrong. Perhaps have that renamed and fix the link here? Either way as-is it seems wrong.","commit_id":"f645de7de3461ab274ffb76fb73c0817be425892"},{"author":{"_account_id":114,"name":"Victor Lowther","email":"victor.lowther@gmail.com","username":"victor-lowther"},"change_message_id":"4199b66e4cfc9d2df2b957f2586a8b7aafc229af","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"* It should be noted in documentation that there are still attack vectors if"},{"line_number":244,"context_line":"  baremetal nodes are given to untrusted users or if a baremetal node is"},{"line_number":245,"context_line":"  compromised."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"* If the API is called to set a node into a clean state,"},{"line_number":248,"context_line":"  that node could be tied up for potentially hours. If run against enough"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a961159_e2e2642e","line":245,"updated":"2014-12-29 19:31:12.000000000","message":"Is is useful to enumerate some examples of attack vectors in the spec?","commit_id":"f645de7de3461ab274ffb76fb73c0817be425892"},{"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":"dbdd4a07db9513e538ec813a33ca244447de787a","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"* It should be noted in documentation that there are still attack vectors if"},{"line_number":244,"context_line":"  baremetal nodes are given to untrusted users or if a baremetal node is"},{"line_number":245,"context_line":"  compromised."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"* If the API is called to set a node into a clean state,"},{"line_number":248,"context_line":"  that node could be tied up for potentially hours. If run against enough"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a961159_18fb4d48","line":245,"in_reply_to":"3a961159_e2e2642e","updated":"2014-12-30 18:36:56.000000000","message":"I don\u0027t think that\u0027s in-scope of Ironic or in-scope of this specification. It\u0027s going to vary wildly based on hardware and therefore shouldn\u0027t be codified in this spec.\n\nI think this statement should be updated to say that Ironic is going to make a best effort; for more effective cleaning or security you\u0027ll need specific support for your hardware and a lot of brainpower :).","commit_id":"f645de7de3461ab274ffb76fb73c0817be425892"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3d8f3ede4d640265eb27018ad975bf20a2ebc629","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  which takes one of the namedtuples returned by `get_clean_steps()` as an"},{"line_number":91,"context_line":"  arg, and execute the specified step."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"* Create a new function in the conductor: `clean(task)` to run all"},{"line_number":94,"context_line":"  enabled clean steps. It will get a list of all enabled"},{"line_number":95,"context_line":"  steps and execute them by cleaning_priority. The conductor will track the"},{"line_number":96,"context_line":"  current step in a new field on the node called task_state (if we use a"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_03e8127b","line":93,"updated":"2015-01-05 10:13:40.000000000","message":"How does the async clean steps work ? For example, if I want to perform a clean step which requires IPA ramdisk, Iroinc would ideally set the node to be booted by IPA ramdisk in the clean step and would wait for the heartbeat.  In the hearbeat method, Ironic will recognise the current_provision_state and clean_step and would invoke the appropriate method.  How do we return out if we encounter such a method ?\n\nWe could do something like the following:\n\n* Conductor executes a clean step which requires IPA ramdisk to be booted first on the bare metal.\n* Clean step returns some specific value to indicate that the cleaning step is in progress.\n* Conductor could note this and come out of clean method.\n* The method called during heartbeat could actually do the call (or schedule) a clean again to continue from the next step from where it left off.","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d990737765dc5769ce57dcf11ae66be36ebf2310","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  which takes one of the namedtuples returned by `get_clean_steps()` as an"},{"line_number":91,"context_line":"  arg, and execute the specified step."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"* Create a new function in the conductor: `clean(task)` to run all"},{"line_number":94,"context_line":"  enabled clean steps. It will get a list of all enabled"},{"line_number":95,"context_line":"  steps and execute them by cleaning_priority. The conductor will track the"},{"line_number":96,"context_line":"  current step in a new field on the node called task_state (if we use a"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_23117904","line":93,"in_reply_to":"3a961159_03e8127b","updated":"2015-01-05 22:50:15.000000000","message":"Yeah that\u0027s what I was thinking (and basically how we have it implemented downstream). I didn\u0027t go into too much detail, because I don\u0027t think it belongs in the spec.","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3d8f3ede4d640265eb27018ad975bf20a2ebc629","unresolved":false,"context_lines":[{"line_number":93,"context_line":"* Create a new function in the conductor: `clean(task)` to run all"},{"line_number":94,"context_line":"  enabled clean steps. It will get a list of all enabled"},{"line_number":95,"context_line":"  steps and execute them by cleaning_priority. The conductor will track the"},{"line_number":96,"context_line":"  current step in a new field on the node called task_state (if we use a"},{"line_number":97,"context_line":"  general task state) or clean_step (if we want it to be specific)."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"* In the event of a tie for cleaning_priority,"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_e3bea663","line":96,"updated":"2015-01-05 10:13:40.000000000","message":"Do we intend to use task_state ? I don\u0027t see it anywhere else.","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d990737765dc5769ce57dcf11ae66be36ebf2310","unresolved":false,"context_lines":[{"line_number":93,"context_line":"* Create a new function in the conductor: `clean(task)` to run all"},{"line_number":94,"context_line":"  enabled clean steps. It will get a list of all enabled"},{"line_number":95,"context_line":"  steps and execute them by cleaning_priority. The conductor will track the"},{"line_number":96,"context_line":"  current step in a new field on the node called task_state (if we use a"},{"line_number":97,"context_line":"  general task state) or clean_step (if we want it to be specific)."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"* In the event of a tie for cleaning_priority,"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_a35ba920","line":96,"in_reply_to":"3a961159_e3bea663","updated":"2015-01-05 22:50:15.000000000","message":"I\u0027ll just go with clean_step and we can generalize later if necessary.","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"20d7c62a6c7f9dd8255479e62ca9567aad0a50be","unresolved":false,"context_lines":[{"line_number":250,"context_line":"  nodes in a cluster by a bad actor, the cluster could run out of capacity"},{"line_number":251,"context_line":"  quickly. These APIs by default require admin privileges. However, a user"},{"line_number":252,"context_line":"  could provision and unprovision nodes quickly, leading to a denial of"},{"line_number":253,"context_line":"  service. Quotas could mitigate this issue."},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"Other end user impact"},{"line_number":256,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_a662e13a","line":253,"updated":"2015-01-05 17:52:25.000000000","message":"You probably plan to do this, but this, too, should be documented for deployers, IMO.","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d990737765dc5769ce57dcf11ae66be36ebf2310","unresolved":false,"context_lines":[{"line_number":250,"context_line":"  nodes in a cluster by a bad actor, the cluster could run out of capacity"},{"line_number":251,"context_line":"  quickly. These APIs by default require admin privileges. However, a user"},{"line_number":252,"context_line":"  could provision and unprovision nodes quickly, leading to a denial of"},{"line_number":253,"context_line":"  service. Quotas could mitigate this issue."},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"Other end user impact"},{"line_number":256,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_43f925c7","line":253,"in_reply_to":"3a961159_a662e13a","updated":"2015-01-05 22:50:15.000000000","message":"Definitely. I\u0027ll add it.","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8202ae654e7e1ce7195fd0dc730b0c9c85b16db1","unresolved":false,"context_lines":[{"line_number":320,"context_line":"* Add API checks for clean states and allow \"CLEANED\" as a"},{"line_number":321,"context_line":"  provision target state"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"* Add API end point /nodes/\u003cuuid\u003e/cleaning/clean_steps"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"* Add Nova driver support"},{"line_number":326,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_39d5611b","line":323,"updated":"2014-12-31 12:19:50.000000000","message":"s/clean_steps/steps if you do another revision","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d990737765dc5769ce57dcf11ae66be36ebf2310","unresolved":false,"context_lines":[{"line_number":320,"context_line":"* Add API checks for clean states and allow \"CLEANED\" as a"},{"line_number":321,"context_line":"  provision target state"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"* Add API end point /nodes/\u003cuuid\u003e/cleaning/clean_steps"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"* Add Nova driver support"},{"line_number":326,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a961159_83ff8daa","line":323,"in_reply_to":"3a961159_39d5611b","updated":"2015-01-05 22:50:15.000000000","message":"Done","commit_id":"cd59d5eb23ac3db58e71990666ba12d605bd836a"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"5a921df864f4ca388b066ef0a34f6faa2191a4b3","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Implement Cleaning States"},{"line_number":9,"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\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/ironic/+spec/decom-nodes"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"When a node has finished a workload, drivers should have the opportunity to"},{"line_number":14,"context_line":"run a set of tasks during immediately after tear down and before the node is"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_bba645bf","line":11,"updated":"2015-01-07 03:22:41.000000000","message":"blueprint url doesn\u0027t exist. need to be updated.","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"2dc464e955fbdf1b7f6d2da9cad881d0afbd97a8","unresolved":false,"context_lines":[{"line_number":75,"context_line":"  Clean Step:"},{"line_number":76,"context_line":"    ("},{"line_number":77,"context_line":"      \u0027step\u0027\u003d\u0027function_name\u0027,"},{"line_number":78,"context_line":"      \u0027priority\u0027\u0027an int or float, used for sorting, described below\u0027,"},{"line_number":79,"context_line":"      \u0027driver\u0027\u003d\u0027driver_interface_name"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    )"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_9f6db105","line":78,"updated":"2015-01-09 04:05:51.000000000","message":"\"\u003d\" is necessary between \u0027priority\u0027 and \u0027an int or float, used for sorting, described below\u0027, right?","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"53e4e10310708b07e9494cda47253fe606ac1205","unresolved":false,"context_lines":[{"line_number":75,"context_line":"  Clean Step:"},{"line_number":76,"context_line":"    ("},{"line_number":77,"context_line":"      \u0027step\u0027\u003d\u0027function_name\u0027,"},{"line_number":78,"context_line":"      \u0027priority\u0027\u0027an int or float, used for sorting, described below\u0027,"},{"line_number":79,"context_line":"      \u0027driver\u0027\u003d\u0027driver_interface_name"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    )"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_5d4fbc6a","line":78,"in_reply_to":"3a961159_9f6db105","updated":"2015-01-09 22:18:28.000000000","message":"Done","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"d531416253a165ff88468636d2d3c265022a3122","unresolved":false,"context_lines":[{"line_number":77,"context_line":"      \u0027step\u0027\u003d\u0027function_name\u0027,"},{"line_number":78,"context_line":"      \u0027priority\u0027\u0027an int or float, used for sorting, described below\u0027,"},{"line_number":79,"context_line":"      \u0027driver\u0027\u003d\u0027driver_interface_name"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    )"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"  Only steps with a priority greater than 0 (enabled steps) will be returned."}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_a318b7cd","line":80,"updated":"2015-01-08 08:07:42.000000000","message":"nit: this line is unnecessary.","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c20c7a9975bf525aa879eb17c944fb22a43af993","unresolved":false,"context_lines":[{"line_number":156,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":157,"context_line":"  while the node is in a CLEANING state. A node in CLEANFAIL"},{"line_number":158,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":159,"context_line":"  to restart the node to fix it."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"* The API will allow users to put a node directly into cleaning"},{"line_number":162,"context_line":"  provision_state with a POST, the same as how provision state is changed"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_1efe3938","line":159,"updated":"2015-01-08 14:16:14.000000000","message":"so power on should also be enabled?","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"53e4e10310708b07e9494cda47253fe606ac1205","unresolved":false,"context_lines":[{"line_number":156,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":157,"context_line":"  while the node is in a CLEANING state. A node in CLEANFAIL"},{"line_number":158,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":159,"context_line":"  to restart the node to fix it."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"* The API will allow users to put a node directly into cleaning"},{"line_number":162,"context_line":"  provision_state with a POST, the same as how provision state is changed"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_1d453443","line":159,"in_reply_to":"3a961159_1efe3938","updated":"2015-01-09 22:18:28.000000000","message":"Done","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c20c7a9975bf525aa879eb17c944fb22a43af993","unresolved":false,"context_lines":[{"line_number":196,"context_line":"* The BaseDriver will have a `get_clean_steps()` and"},{"line_number":197,"context_line":"  `execute_clean_steps()` functions added and implemented."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"  def get_clean_steps(task):"},{"line_number":200,"context_line":"    \"\"\"Return the clean steps this driver can perform on a node\"\"\""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    :param task: a task from TaskManager."}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_1eac7934","line":199,"updated":"2015-01-08 14:16:14.000000000","message":"nit: maybe format these as code blocks","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"53e4e10310708b07e9494cda47253fe606ac1205","unresolved":false,"context_lines":[{"line_number":196,"context_line":"* The BaseDriver will have a `get_clean_steps()` and"},{"line_number":197,"context_line":"  `execute_clean_steps()` functions added and implemented."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"  def get_clean_steps(task):"},{"line_number":200,"context_line":"    \"\"\"Return the clean steps this driver can perform on a node\"\"\""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    :param task: a task from TaskManager."}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_5d76dca4","line":199,"in_reply_to":"3a961159_1eac7934","updated":"2015-01-09 22:18:28.000000000","message":"Done","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c20c7a9975bf525aa879eb17c944fb22a43af993","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    :param task: a task from TaskManager."},{"line_number":209,"context_line":"    :param step: a step from get_clean_steps()"},{"line_number":210,"context_line":"    :raises CleanExecuteException: if the step fails"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":213,"context_line":"  expected to test their implementation thoroughly."}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_fe77add1","line":210,"updated":"2015-01-08 14:16:14.000000000","message":"maybe call it CleanStepFailed to be consistent with other exceptions (i.e. we use Failed postfix but do not use Exception postfix)","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"53e4e10310708b07e9494cda47253fe606ac1205","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    :param task: a task from TaskManager."},{"line_number":209,"context_line":"    :param step: a step from get_clean_steps()"},{"line_number":210,"context_line":"    :raises CleanExecuteException: if the step fails"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":213,"context_line":"  expected to test their implementation thoroughly."}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a961159_dd61ecd5","line":210,"in_reply_to":"3a961159_fe77add1","updated":"2015-01-09 22:18:28.000000000","message":"Done","commit_id":"d778446251ba92c19106b009f29315a63334234b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/ironic/+spec/implement-cleaning-states"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"When a node has finished a workload, drivers should have the opportunity to"},{"line_number":14,"context_line":"run a set of tasks during immediately after tear down and before the node is"},{"line_number":15,"context_line":"available for scheduling again."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_d7f5f251","line":14,"updated":"2015-01-13 21:27:26.000000000","message":"nit: s/during//","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/ironic/+spec/implement-cleaning-states"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"When a node has finished a workload, drivers should have the opportunity to"},{"line_number":14,"context_line":"run a set of tasks during immediately after tear down and before the node is"},{"line_number":15,"context_line":"available for scheduling again."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_b4f75659","line":14,"in_reply_to":"3a961159_d7f5f251","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* Add a decorator `@clean_step(priority)` to decorate steps that"},{"line_number":60,"context_line":"  should be run as a part of CLEANING. priority is the order in which the"},{"line_number":61,"context_line":"  step will be run. The function with the highest priority will run first,"},{"line_number":62,"context_line":"  followed by the one with the second highest priority, etc. If priority is"},{"line_number":63,"context_line":"  set to 0, the step will not be executed. The argument should be a config"},{"line_number":64,"context_line":"  option, e.g. `priority\u003dCONF.$driver.$stepname_priority` to"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_02a01aa4","line":61,"updated":"2015-01-13 21:27:26.000000000","message":"will all the cleaning functions have the same arguments?","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* Add a decorator `@clean_step(priority)` to decorate steps that"},{"line_number":60,"context_line":"  should be run as a part of CLEANING. priority is the order in which the"},{"line_number":61,"context_line":"  step will be run. The function with the highest priority will run first,"},{"line_number":62,"context_line":"  followed by the one with the second highest priority, etc. If priority is"},{"line_number":63,"context_line":"  set to 0, the step will not be executed. The argument should be a config"},{"line_number":64,"context_line":"  option, e.g. `priority\u003dCONF.$driver.$stepname_priority` to"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_45f789d4","line":61,"in_reply_to":"3a961159_02a01aa4","updated":"2015-01-13 23:51:53.000000000","message":"They\u0027ll need the same interface for each step in a given driver. On each step, the conductor calls execute_clean_step on the matching driver, and the driver calls the individual function, so they\u0027ll likely call each step the same way.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":94,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":95,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* Using CLEANING, CLEANED, and CLEANFAIL that will be added in the"},{"line_number":99,"context_line":"  new state machine spec [1]. These states occur between DELETED and AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_82932a5b","line":96,"updated":"2015-01-13 21:27:26.000000000","message":"What if there are two steps in the same driver/interface, with the same priority?","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f52b60f8384d06c01b1b1b866580752fd75551db","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":94,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":95,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* Using CLEANING, CLEANED, and CLEANFAIL that will be added in the"},{"line_number":99,"context_line":"  new state machine spec [1]. These states occur between DELETED and AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_b9b21447","line":96,"in_reply_to":"3a961159_05982169","updated":"2015-01-14 01:13:37.000000000","message":"I\u0027m fine with the former. I don\u0027t yet have an opinion, just want to know that something will be done ;)","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":94,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":95,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* Using CLEANING, CLEANED, and CLEANFAIL that will be added in the"},{"line_number":99,"context_line":"  new state machine spec [1]. These states occur between DELETED and AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_05982169","line":96,"in_reply_to":"3a961159_82932a5b","updated":"2015-01-13 23:51:53.000000000","message":"We could make Ironic fail to start up properly when it is loading drivers (in the conductor\u0027s init_host()), and be very noisy about why it\u0027s failing. Alternatively we could log a warning and execute in some arbitrary, stable order. Considering these are often \"scary\" operations, I\u0027d lean towards the former.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":94,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":95,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* Using CLEANING, CLEANED, and CLEANFAIL that will be added in the"},{"line_number":99,"context_line":"  new state machine spec [1]. These states occur between DELETED and AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_94feda36","line":96,"in_reply_to":"3a961159_b9b21447","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"  state. A node will be in CLEANED state after CLEANING completes and until the"},{"line_number":104,"context_line":"  conductor gets a chance to move it to AVAILABLE."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"* Nodes maybe be put into CLEANING via an API call (described below) only"},{"line_number":107,"context_line":"  from MANAGED and AVAILABLE states. MANAGED allows an operator to clean a node"},{"line_number":108,"context_line":"  before it is available for scheduling. This ensures new nodes are at the same"},{"line_number":109,"context_line":"  baseline as other, already added nodes."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_228a761a","line":106,"updated":"2015-01-13 21:27:26.000000000","message":"nit. s/maybe/may/","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"  conductor gets a chance to move it to AVAILABLE."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"* Nodes maybe be put into CLEANING via an API call (described below) only"},{"line_number":107,"context_line":"  from MANAGED and AVAILABLE states. MANAGED allows an operator to clean a node"},{"line_number":108,"context_line":"  before it is available for scheduling. This ensures new nodes are at the same"},{"line_number":109,"context_line":"  baseline as other, already added nodes."},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_02b57acf","line":107,"updated":"2015-01-13 21:27:26.000000000","message":"I looked at the FSM proposal. Unless I\u0027m reading it wrong, the diagram doesn\u0027t show AVAILABLE -\u003e CLEAN*, I think you\u0027d have to do AVAILABLE-\u003eMANAGED-\u003eCLEAN*","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":104,"context_line":"  conductor gets a chance to move it to AVAILABLE."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"* Nodes maybe be put into CLEANING via an API call (described below) only"},{"line_number":107,"context_line":"  from MANAGED and AVAILABLE states. MANAGED allows an operator to clean a node"},{"line_number":108,"context_line":"  before it is available for scheduling. This ensures new nodes are at the same"},{"line_number":109,"context_line":"  baseline as other, already added nodes."},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_68fb7c48","line":107,"in_reply_to":"3a961159_02b57acf","updated":"2015-01-13 23:51:53.000000000","message":"Ah, you\u0027re right.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":104,"context_line":"  conductor gets a chance to move it to AVAILABLE."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"* Nodes maybe be put into CLEANING via an API call (described below) only"},{"line_number":107,"context_line":"  from MANAGED and AVAILABLE states. MANAGED allows an operator to clean a node"},{"line_number":108,"context_line":"  before it is available for scheduling. This ensures new nodes are at the same"},{"line_number":109,"context_line":"  baseline as other, already added nodes."},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_349b6618","line":107,"in_reply_to":"3a961159_02b57acf","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":109,"context_line":"  baseline as other, already added nodes."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* The ZAPPING API will allow nodes to go through a single, specified CLEAN"},{"line_number":112,"context_line":"  step from the MANAGED state."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* Make the Nova Virt Driver look for CLEANING, CLEANED, and CLEANFAIL states"},{"line_number":115,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_42e6a2e9","line":112,"updated":"2015-01-13 21:27:26.000000000","message":"just to be clear. During CLEAN*, one or more cleaning steps can be done. I think you are using \u0027step\u0027 here in a different way? Or do you really mean only one clean_step (the one with highest priority) will be done?","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"  baseline as other, already added nodes."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* The ZAPPING API will allow nodes to go through a single, specified CLEAN"},{"line_number":112,"context_line":"  step from the MANAGED state."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* Make the Nova Virt Driver look for CLEANING, CLEANED, and CLEANFAIL states"},{"line_number":115,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_b4011609","line":112,"in_reply_to":"3a961159_0559018e","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":109,"context_line":"  baseline as other, already added nodes."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* The ZAPPING API will allow nodes to go through a single, specified CLEAN"},{"line_number":112,"context_line":"  step from the MANAGED state."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* Make the Nova Virt Driver look for CLEANING, CLEANED, and CLEANFAIL states"},{"line_number":115,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_0559018e","line":112,"in_reply_to":"3a961159_42e6a2e9","updated":"2015-01-13 23:51:53.000000000","message":"During CLEANING, it will execute all enabled CLEANING steps in an automated fashion. With ZAPPING, an operator can force a node to execute a single (or possibly a list of) CLEAN step(s). This would look like a POST to the Ironic API, setting provision_state to ZAPPING with a body describing the step to execute.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":147,"context_line":"  node.driver_info. For example, the agent driver will store the IPA hardware"},{"line_number":148,"context_line":"  manager version in driver_info, so it can detect changes and restart"},{"line_number":149,"context_line":"  cleaning if a new hardware manager is deployed during a cleaning cycle."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_227b56f5","line":147,"updated":"2015-01-13 21:27:26.000000000","message":"Are people good with using node.driver_info for this? I\u0027m not sure...","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":144,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":147,"context_line":"  node.driver_info. For example, the agent driver will store the IPA hardware"},{"line_number":148,"context_line":"  manager version in driver_info, so it can detect changes and restart"},{"line_number":149,"context_line":"  cleaning if a new hardware manager is deployed during a cleaning cycle."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_37c6089d","line":147,"in_reply_to":"3a961159_19408806","updated":"2015-01-14 22:45:09.000000000","message":"I couldn\u0027t find anything in the logs about another field. Since cleaning_steps are functions of the driver, I\u0027m going to stick with driver_info.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":144,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":147,"context_line":"  node.driver_info. For example, the agent driver will store the IPA hardware"},{"line_number":148,"context_line":"  manager version in driver_info, so it can detect changes and restart"},{"line_number":149,"context_line":"  cleaning if a new hardware manager is deployed during a cleaning cycle."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_c5ec5995","line":147,"in_reply_to":"3a961159_227b56f5","updated":"2015-01-13 23:51:53.000000000","message":"I\u0027m not the biggest fan, but it seems to be the pattern. The only other places don\u0027t make sense: instance_info isn\u0027t appropriate for driver data and extra should be for operators to modify only. Creating a new clean_info seems excessive.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f52b60f8384d06c01b1b1b866580752fd75551db","unresolved":false,"context_lines":[{"line_number":144,"context_line":"  during CLEANING to be more simply implemented."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"* If a cleaning step needs to store additional information, it should use"},{"line_number":147,"context_line":"  node.driver_info. For example, the agent driver will store the IPA hardware"},{"line_number":148,"context_line":"  manager version in driver_info, so it can detect changes and restart"},{"line_number":149,"context_line":"  cleaning if a new hardware manager is deployed during a cleaning cycle."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_19408806","line":147,"in_reply_to":"3a961159_c5ec5995","updated":"2015-01-14 01:13:37.000000000","message":"I think we had discussed a new field that was needed for another feature. Maybe that can be used for this too. I can\u0027t recall the name of the field, if we even named it; it\u0027s in one of our meeting minutes I think.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"19927cc77befd5b92bf7051874ff90c95479472e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"---------------"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":155,"context_line":"  while the node is in a CLEANING state. A node in CLEANFAIL"},{"line_number":156,"context_line":"  state may be powered on and off via the API, because the operator will"},{"line_number":157,"context_line":"  likely need to restart the node to fix it."},{"line_number":158,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_5f831ba9","line":155,"updated":"2015-01-12 11:09:17.000000000","message":"so it won\u0027t be possible to drive cleaning by an outside service (like with inspecting and discoverd), right?","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":152,"context_line":"---------------"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":155,"context_line":"  while the node is in a CLEANING state. A node in CLEANFAIL"},{"line_number":156,"context_line":"  state may be powered on and off via the API, because the operator will"},{"line_number":157,"context_line":"  likely need to restart the node to fix it."},{"line_number":158,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_65fba548","line":155,"in_reply_to":"3a961159_5f831ba9","updated":"2015-01-13 23:51:53.000000000","message":"That will be available with ZAPPING.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"  anywhere else in Ironic."},{"line_number":162,"context_line":"  This can be useful for verifying newly added nodes or if"},{"line_number":163,"context_line":"  an operator wants to put a fleet of inactive servers into a known state. A"},{"line_number":164,"context_line":"  node can only be put into CLEANING state from MANAGED, AVAILABLE, or"},{"line_number":165,"context_line":"  CLEANFAIL states."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"* Nodes in CLEANFAIL may be put into CLEANING or AVAILABLE state,"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_02c65a16","line":164,"updated":"2015-01-13 21:27:26.000000000","message":"see my comment above wrt AVAILABLE -\u003e CLEANING","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"  anywhere else in Ironic."},{"line_number":162,"context_line":"  This can be useful for verifying newly added nodes or if"},{"line_number":163,"context_line":"  an operator wants to put a fleet of inactive servers into a known state. A"},{"line_number":164,"context_line":"  node can only be put into CLEANING state from MANAGED, AVAILABLE, or"},{"line_number":165,"context_line":"  CLEANFAIL states."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"* Nodes in CLEANFAIL may be put into CLEANING or AVAILABLE state,"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_5742b40f","line":164,"in_reply_to":"3a961159_02c65a16","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"* GET requests to the node\u0027s provision state API"},{"line_number":177,"context_line":"  (/nodes/\u003cuuid\u003e/states/provision) should return the current node.clean_step"},{"line_number":178,"context_line":"  as well."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"RPC API impact"},{"line_number":181,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_a2058616","line":178,"updated":"2015-01-13 21:27:26.000000000","message":"it should? I didn\u0027t realize we even had a GET on /nodes/\u003cuuid\u003e/states/provision. I thought you got the provision states via GET /nodes/\u003cuuid\u003e/.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"* GET requests to the node\u0027s provision state API"},{"line_number":177,"context_line":"  (/nodes/\u003cuuid\u003e/states/provision) should return the current node.clean_step"},{"line_number":178,"context_line":"  as well."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"RPC API impact"},{"line_number":181,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_a58cadd8","line":178,"in_reply_to":"3a961159_a2058616","updated":"2015-01-13 23:51:53.000000000","message":"Ahh, you\u0027re correct. You can only PUT to that endpoint.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"* GET requests to the node\u0027s provision state API"},{"line_number":177,"context_line":"  (/nodes/\u003cuuid\u003e/states/provision) should return the current node.clean_step"},{"line_number":178,"context_line":"  as well."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"RPC API impact"},{"line_number":181,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_f75d60ed","line":178,"in_reply_to":"3a961159_a58cadd8","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":180,"context_line":"RPC API impact"},{"line_number":181,"context_line":"--------------"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"At the end of a tear down, the conductor will RPC call() the clean()"},{"line_number":184,"context_line":"method of the conductor."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"As the states will first be added as no-ops in the new state machine spec,"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_3d08d727","line":183,"updated":"2015-01-13 21:27:26.000000000","message":"Dumb question. Why does the conductor have to do an rpc call to itself?","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1f6361471a0092e9e20be484bee6f43c13f75e75","unresolved":false,"context_lines":[{"line_number":180,"context_line":"RPC API impact"},{"line_number":181,"context_line":"--------------"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"At the end of a tear down, the conductor will RPC call() the clean()"},{"line_number":184,"context_line":"method of the conductor."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"As the states will first be added as no-ops in the new state machine spec,"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_28d334d6","line":183,"in_reply_to":"3a961159_3d08d727","updated":"2015-01-13 23:51:53.000000000","message":"Not a dumb question at all! I\u0027m not sure this is strictly necessary, but it does keep a consistent API to the do_node_clean() (like do_node_tear_down already exists). We\u0027ll need to be able to call do_node_clean() via RPC since you can manually go MANAGEABLE-\u003eCLEANING. Both do_node_clean and do_node_tear_down will need to do work in a greenthread. If we just call self.do_node_clean at the end of do_node_tear_down\u0027s greenthread work, we\u0027ll wind up tying up two threads unnecessarily.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":268,"context_line":"* The node will be locked for the duration of the clean."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"* Database calls will increase, because the state is saved after each"},{"line_number":271,"context_line":"  cleaning step that requires a reboot or long running process."},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"* Rebalances, in the worst case, will require the node to redo one step"},{"line_number":274,"context_line":"  based on the cleaning_step. This"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_3d561707","line":271,"updated":"2015-01-13 21:27:26.000000000","message":"presumably, you\u0027d save the \u0027current\u0027 cleaning step, regardless of what that step does.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":268,"context_line":"* The node will be locked for the duration of the clean."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"* Database calls will increase, because the state is saved after each"},{"line_number":271,"context_line":"  cleaning step that requires a reboot or long running process."},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"* Rebalances, in the worst case, will require the node to redo one step"},{"line_number":274,"context_line":"  based on the cleaning_step. This"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_17310ca2","line":271,"in_reply_to":"3a961159_3d561707","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":273,"context_line":"* Rebalances, in the worst case, will require the node to redo one step"},{"line_number":274,"context_line":"  based on the cleaning_step. This"},{"line_number":275,"context_line":"  could happen if a conductor dies while it owns a node that is doing a long"},{"line_number":276,"context_line":"  running process. Decommission steps should be implemented as idempotent"},{"line_number":277,"context_line":"  actions, to avoid issues here."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"Other deployer impact"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_9d3aabc2","line":276,"updated":"2015-01-13 21:27:26.000000000","message":"\u0027Decommision\u0027 -- you mean clean or cleaning?","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":273,"context_line":"* Rebalances, in the worst case, will require the node to redo one step"},{"line_number":274,"context_line":"  based on the cleaning_step. This"},{"line_number":275,"context_line":"  could happen if a conductor dies while it owns a node that is doing a long"},{"line_number":276,"context_line":"  running process. Decommission steps should be implemented as idempotent"},{"line_number":277,"context_line":"  actions, to avoid issues here."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"Other deployer impact"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_77e6d017","line":276,"in_reply_to":"3a961159_9d3aabc2","updated":"2015-01-14 22:45:09.000000000","message":"Done","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2f0f4068cc739bfceb24ed1dd3ae0d3ac610207a","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* Deployers will need to inspect which clean steps are being performed and"},{"line_number":283,"context_line":"  adjust whether each step is performed and at what priority if the defaults"},{"line_number":284,"context_line":"  don\u0027t work for their environment."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"Developer impact"},{"line_number":287,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_7d66dfef","line":284,"updated":"2015-01-13 21:27:26.000000000","message":"Any thought about what the default is going to be? (OR did you mention it already?)","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"89c53fc7ae259c4c2ab57caadfd0675fbae52ae5","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* Deployers will need to inspect which clean steps are being performed and"},{"line_number":283,"context_line":"  adjust whether each step is performed and at what priority if the defaults"},{"line_number":284,"context_line":"  don\u0027t work for their environment."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"Developer impact"},{"line_number":287,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3a961159_17090c95","line":284,"in_reply_to":"3a961159_7d66dfef","updated":"2015-01-14 22:45:09.000000000","message":"Sorry! Missed this one yesterday. For the default for enabling/disabling all of cleaning, I would strongly recommend enabling it and enabling at least a bare minimum of steps by default, such as erasing disks.","commit_id":"2bb631563ce472df940f62c46fba7533b25751d0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cae4939b8d9f6f7421f18a74670a20aebe6b155d","unresolved":false,"context_lines":[{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* If there is a tie for priority within a single driver (an operator"},{"line_number":99,"context_line":"  inadvertently sets two to the same priority), the conductor will fail"},{"line_number":100,"context_line":"  to load that driver while starting up, and log errors about the overlapping"},{"line_number":101,"context_line":"  priorities."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_3d3b349d","line":99,"updated":"2015-01-15 11:56:25.000000000","message":"it\u0027s not operator who set priorities, it\u0027s driver developer, right? so in theory it should be caught by unit tests?","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d147bef6aab665f159508209f3c52fb73f7d0003","unresolved":false,"context_lines":[{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* If there is a tie for priority within a single driver (an operator"},{"line_number":99,"context_line":"  inadvertently sets two to the same priority), the conductor will fail"},{"line_number":100,"context_line":"  to load that driver while starting up, and log errors about the overlapping"},{"line_number":101,"context_line":"  priorities."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_6cf42555","line":99,"in_reply_to":"3a961159_26d79cc0","updated":"2015-01-15 17:17:32.000000000","message":"We should definitely catch anyone trying to default a priority to the same as another priority, same driver or not, in code review. But, all the priorities are config options, so it is possible an operator will set them to the same priority.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b5f8c5543874fcc352161d926712e4e22df509c2","unresolved":false,"context_lines":[{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* If there is a tie for priority within a single driver (an operator"},{"line_number":99,"context_line":"  inadvertently sets two to the same priority), the conductor will fail"},{"line_number":100,"context_line":"  to load that driver while starting up, and log errors about the overlapping"},{"line_number":101,"context_line":"  priorities."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_26d79cc0","line":99,"in_reply_to":"3a961159_3d3b349d","updated":"2015-01-15 16:18:18.000000000","message":"@Dmitry. Yes, the driver developer. Although there could be out-of-tree drivers (those drivers that we love...)","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"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":"d486d6e9f066074a1d073144dc09383cfa317f9a","unresolved":false,"context_lines":[{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* If there is a tie for priority within a single driver (an operator"},{"line_number":99,"context_line":"  inadvertently sets two to the same priority), the conductor will fail"},{"line_number":100,"context_line":"  to load that driver while starting up, and log errors about the overlapping"},{"line_number":101,"context_line":"  priorities."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_085aa64f","line":99,"in_reply_to":"3a961159_4ddda0dc","updated":"2015-01-15 20:26:33.000000000","message":"I am OK with this; I also missed the part about it being within a single driver.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"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":"df4731d1d22826c1c589e85ff49f1143148583e3","unresolved":false,"context_lines":[{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* If there is a tie for priority within a single driver (an operator"},{"line_number":99,"context_line":"  inadvertently sets two to the same priority), the conductor will fail"},{"line_number":100,"context_line":"  to load that driver while starting up, and log errors about the overlapping"},{"line_number":101,"context_line":"  priorities."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_b2e2dfd1","line":99,"in_reply_to":"3a961159_6cf42555","updated":"2015-01-15 19:05:00.000000000","message":"Also remember that custom IPA hardware managers can add steps with certain priorities, too. This is a problem that can happen outside of load_time, because those priorities are gotten from the agent dynamically (so custom Hardware Managers can add new decom steps).\n\nIDK a good way to handle this (I\u0027d suggest a reliable tie-breaking mechanism; like alphabetical ordering if the numbers match), but this will not work.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"6aa861713a754e9aee9309251544180f9d34d8c2","unresolved":false,"context_lines":[{"line_number":96,"context_line":"  then the deploy driver\u0027s step."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* If there is a tie for priority within a single driver (an operator"},{"line_number":99,"context_line":"  inadvertently sets two to the same priority), the conductor will fail"},{"line_number":100,"context_line":"  to load that driver while starting up, and log errors about the overlapping"},{"line_number":101,"context_line":"  priorities."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_4ddda0dc","line":99,"in_reply_to":"3a961159_b2e2dfd1","updated":"2015-01-15 20:16:37.000000000","message":"As long as IPA has a method of tie breaking its own steps and presenting them in a tie-broken fashion when Ironic queries for a list of steps for a node, it will work. IPA will be the deploy driver, so the previous paragraph for tie breaking between drivers handles it. \n\nAs for tie breaking in IPA, I think starting with their hardware support number to break ties, and if two managers present two priorities in at the same level, throw an error on boot in IPA?","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cae4939b8d9f6f7421f18a74670a20aebe6b155d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"  state. A node will be in CLEANED state after CLEANING completes and until the"},{"line_number":109,"context_line":"  conductor gets a chance to move it to AVAILABLE."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* Nodes may be be put into CLEANING via an API call (described below) only"},{"line_number":112,"context_line":"  from MANAGED or CLEANFAIL states. MANAGED allows an operator to clean a node"},{"line_number":113,"context_line":"  before it is available for scheduling. This ensures new nodes are at the same"},{"line_number":114,"context_line":"  baseline as other, already added nodes."}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_7d413c09","line":111,"updated":"2015-01-15 11:56:25.000000000","message":"I guess Ruby meant s/may be/may/ :) (i.e. only one \u0027be\u0027)","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b5f8c5543874fcc352161d926712e4e22df509c2","unresolved":false,"context_lines":[{"line_number":108,"context_line":"  state. A node will be in CLEANED state after CLEANING completes and until the"},{"line_number":109,"context_line":"  conductor gets a chance to move it to AVAILABLE."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* Nodes may be be put into CLEANING via an API call (described below) only"},{"line_number":112,"context_line":"  from MANAGED or CLEANFAIL states. MANAGED allows an operator to clean a node"},{"line_number":113,"context_line":"  before it is available for scheduling. This ensures new nodes are at the same"},{"line_number":114,"context_line":"  baseline as other, already added nodes."}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_66f44455","line":111,"in_reply_to":"3a961159_7d413c09","updated":"2015-01-15 16:18:18.000000000","message":"Dmitry can read my mind :-)","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b5f8c5543874fcc352161d926712e4e22df509c2","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_c1940238","line":185,"updated":"2015-01-15 16:18:18.000000000","message":"I\u0027m not convinced that the node-list API should return the (if any) current node.clean_step. Right now, node-list returns uuid, instance_uuid, power state, provision state, and maintenance info. I don\u0027t think that it should return the (if any) current node.clean_step.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"6aa861713a754e9aee9309251544180f9d34d8c2","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_2da85477","line":185,"in_reply_to":"3a961159_0d0f182f","updated":"2015-01-15 20:16:37.000000000","message":"ZAPPING will need something similar, but there was some debate on whether to use a new zapping_step or overload clean_step (zapping and cleaning are closely related). I floated \"task_state\" at one point, but i think Nova uses that to mean something else. \"state_info\" works for me. @Jay and @Dmitry?\n\nAnd if it\u0027s going to be general, I think there\u0027s even more reason to return it in GET to /nodes.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"55f86c8e9f21c2a844e2165dcefd6e7c1383bc35","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_5297fb44","line":185,"in_reply_to":"3a961159_27f4f685","updated":"2015-01-15 19:00:12.000000000","message":"Isn\u0027t it sufficient to get that information (node.clean_step) via the /nodes/\u003cuuid\u003e API?\n\nNow I\u0027m wondering if we should have some more generic name like \u0027provision_details\u0027 or \u0027provision_step\u0027 or \u0027provision_info\u0027 in case other states might want to do something similar.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"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":"d486d6e9f066074a1d073144dc09383cfa317f9a","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_a377f38c","line":185,"in_reply_to":"3a961159_2da85477","updated":"2015-01-15 20:26:33.000000000","message":"I stick with my assertion that this should just go in nodes/detail for now; and that we should not create a field that\u0027ll be used by many different drivers and features in this spec.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945b18cbbae41c87c28d8a0325766279d38e1f9e","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_175aa181","line":185,"in_reply_to":"3a961159_3ec78e99","updated":"2015-01-16 16:59:09.000000000","message":"Alright, node.clean_step it is!\n\n/nodes/details seems ideal. Kind of forgot about that endpoint. /nodes/\u003cuuid\u003e of course.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"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":"df4731d1d22826c1c589e85ff49f1143148583e3","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_f2f6278f","line":185,"in_reply_to":"3a961159_5297fb44","updated":"2015-01-15 19:05:00.000000000","message":"If you\u0027re operating a large Ironic installation, likely a /nodes/detail call is being fed into a dashboard. That information must be there, and consumable, for the operator.\n\nI\u0027m OK with it not being in the normal node list API and only being in the details, but we must have a way to gather this for all nodes in one call for dashboard/metrics purposes.\n\nAlso re: what field; TBH I think we should implement this as it\u0027s written, and talk about that in another spec, as it would likely touch a lot of drivers and a lot more features than just cleaning.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"241c99be799637e34f32cb56c748caf59235e4c3","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_3ec78e99","line":185,"in_reply_to":"3a961159_83d4b747","updated":"2015-01-16 03:20:39.000000000","message":"I tend to think:\n\n1) node.clean_step is ok. If we get to generic here we may end up with two things (e.g. clean/zap) both wanting to use the field at the same time. We\u0027ve bounced around the idea of splitting up the nodes table a bit, that may help out here.\n\n2) Keep this out of /nodes, put it in /nodes/details and /nodes/uuid (which both have everything)\n\nPart 2 needs an update here, whether that\u0027s in a follow-up patch or a new patchset is fine with me.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"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":"b75e59a7e722e7d630e613875f5100ac384ddd80","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_83d4b747","line":185,"in_reply_to":"3a961159_a377f38c","updated":"2015-01-15 20:29:37.000000000","message":"As a note to clarify: I mean this data should go in driver_info, which is already returned by nodes/detail today.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d147bef6aab665f159508209f3c52fb73f7d0003","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_27f4f685","line":185,"in_reply_to":"3a961159_c1940238","updated":"2015-01-15 17:17:32.000000000","message":"I think it makes sense, as it\u0027s really a sub-part of the provision state. If the provision state is going to be stuck in CLEANING for an hour or more in some cases, it seems reasonable to give the operator a bit more insight into what\u0027s going on.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"244043ef41482a3beff5a5569762528677e6804f","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* GET requests to the node\u0027s API"},{"line_number":184,"context_line":"  (/nodes/\u003cuuid\u003e) and node list API (/nodes) should return the current"},{"line_number":185,"context_line":"  node.clean_step as well."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"RPC API impact"},{"line_number":188,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_0d0f182f","line":185,"in_reply_to":"3a961159_f2f6278f","updated":"2015-01-15 19:15:53.000000000","message":"If we think it might be a good idea to have some field that can be used by/within? a state to populate whatever info, it seems like it would be good to name it now, instead of later. Otherwise, we\u0027d have to deal with backwards compatibility issues wrt .\u0027clean_step\u0027 -\u003e \u0027state_info-or-whatever\u0027.\n\nI don\u0027t actually see the harm with naming it \u0027state-info\u0027 or whatever. If CLEAN* is the only state that uses it, that is fine. If other states use it, then we profit?","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"241c99be799637e34f32cb56c748caf59235e4c3","unresolved":false,"context_lines":[{"line_number":240,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":241,"context_line":"  Ironic was updated before Nova, and a driver that implements clean"},{"line_number":242,"context_line":"  which takes a large amount of time was enabled and used. This will need"},{"line_number":243,"context_line":"  to be documented."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Security impact"},{"line_number":246,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_5e41ba08","line":243,"updated":"2015-01-16 03:20:39.000000000","message":"This should likely be in deployer impact, fine with a follow-up patch for this.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945b18cbbae41c87c28d8a0325766279d38e1f9e","unresolved":false,"context_lines":[{"line_number":240,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":241,"context_line":"  Ironic was updated before Nova, and a driver that implements clean"},{"line_number":242,"context_line":"  which takes a large amount of time was enabled and used. This will need"},{"line_number":243,"context_line":"  to be documented."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Security impact"},{"line_number":246,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_774a05ae","line":243,"in_reply_to":"3a961159_5e41ba08","updated":"2015-01-16 16:59:09.000000000","message":"+1","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"241c99be799637e34f32cb56c748caf59235e4c3","unresolved":false,"context_lines":[{"line_number":245,"context_line":"Security impact"},{"line_number":246,"context_line":"---------------"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"* Security will be improved by adding erasing of disks."},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"* It should be noted in documentation that there are still attack vectors if"},{"line_number":251,"context_line":"  baremetal nodes are given to untrusted users or if a baremetal node is"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_be51beda","line":248,"updated":"2015-01-16 03:20:39.000000000","message":"Reference to https://bugs.launchpad.net/ironic/+bug/1174153 would be great here. :)","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945b18cbbae41c87c28d8a0325766279d38e1f9e","unresolved":false,"context_lines":[{"line_number":245,"context_line":"Security impact"},{"line_number":246,"context_line":"---------------"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"* Security will be improved by adding erasing of disks."},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"* It should be noted in documentation that there are still attack vectors if"},{"line_number":251,"context_line":"  baremetal nodes are given to untrusted users or if a baremetal node is"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_179f0103","line":248,"in_reply_to":"3a961159_be51beda","updated":"2015-01-16 16:59:09.000000000","message":"+1","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"241c99be799637e34f32cb56c748caf59235e4c3","unresolved":false,"context_lines":[{"line_number":256,"context_line":"  nodes in a cluster by a bad actor, the cluster could run out of capacity"},{"line_number":257,"context_line":"  quickly. These APIs by default require admin privileges. However, a user"},{"line_number":258,"context_line":"  could provision and unprovision nodes quickly, leading to a denial of"},{"line_number":259,"context_line":"  service. Quotas could mitigate this issue."},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"Other end user impact"},{"line_number":262,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_3e55cec1","line":259,"updated":"2015-01-16 03:20:39.000000000","message":"Well put!","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"8430c8f8ce2749e5b68e28c07db4400e12731652","unresolved":false,"context_lines":[{"line_number":316,"context_line":""},{"line_number":317,"context_line":"Work Items"},{"line_number":318,"context_line":"----------"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"* Add clean() to the conductor"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"* Add get_clean_steps() and execute_clean_step() to the"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_e102b707","line":319,"updated":"2015-01-16 16:13:15.000000000","message":"we should add updating of the current pxe deploy disk to support erasing. I am ok with adding this on the follow up patch.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945b18cbbae41c87c28d8a0325766279d38e1f9e","unresolved":false,"context_lines":[{"line_number":316,"context_line":""},{"line_number":317,"context_line":"Work Items"},{"line_number":318,"context_line":"----------"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"* Add clean() to the conductor"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"* Add get_clean_steps() and execute_clean_step() to the"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_f7b27594","line":319,"in_reply_to":"3a961159_e102b707","updated":"2015-01-16 16:59:09.000000000","message":"+1","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"8430c8f8ce2749e5b68e28c07db4400e12731652","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"* Add API end point /nodes/\u003cuuid\u003e/cleaning/steps"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"* Add Nova driver support"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Dependencies"},{"line_number":335,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_2699356d","line":332,"updated":"2015-01-16 16:13:15.000000000","message":"Is there a Nova spec or review you reference here.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945b18cbbae41c87c28d8a0325766279d38e1f9e","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"* Add API end point /nodes/\u003cuuid\u003e/cleaning/steps"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"* Add Nova driver support"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Dependencies"},{"line_number":335,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_17446171","line":332,"in_reply_to":"3a961159_2699356d","updated":"2015-01-16 16:59:09.000000000","message":"A spec shouldn\u0027t be required in Nova, as we\u0027re just implementing support for a feature that exists in Ironic. I\u0027ll write the Nova review with the rest of the code.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"8430c8f8ce2749e5b68e28c07db4400e12731652","unresolved":false,"context_lines":[{"line_number":342,"context_line":"* Not required, but would be helpful: External event callback API would be"},{"line_number":343,"context_line":"  helpful for the Agent driver (and  probably others\u0027) implementation of clean:"},{"line_number":344,"context_line":"  https://review.openstack.org/#/c/99770/."},{"line_number":345,"context_line":""},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"Testing"},{"line_number":348,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_e6e00dce","line":345,"updated":"2015-01-16 16:13:15.000000000","message":"Nit: we could note that updated deploy disk or agent images would be required","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945b18cbbae41c87c28d8a0325766279d38e1f9e","unresolved":false,"context_lines":[{"line_number":342,"context_line":"* Not required, but would be helpful: External event callback API would be"},{"line_number":343,"context_line":"  helpful for the Agent driver (and  probably others\u0027) implementation of clean:"},{"line_number":344,"context_line":"  https://review.openstack.org/#/c/99770/."},{"line_number":345,"context_line":""},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"Testing"},{"line_number":348,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_f70ef53b","line":345,"in_reply_to":"3a961159_e6e00dce","updated":"2015-01-16 16:59:09.000000000","message":"I can add that to work items.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"8430c8f8ce2749e5b68e28c07db4400e12731652","unresolved":false,"context_lines":[{"line_number":372,"context_line":"* We should document the security problems that still exist, even with cleaning"},{"line_number":373,"context_line":"  enabled."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"References"},{"line_number":377,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":378,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_e177179d","line":375,"updated":"2015-01-16 16:13:15.000000000","message":"we should also document how to inspect which clean steps are being performed and\thow to adjust whether each step is performed or not.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945b18cbbae41c87c28d8a0325766279d38e1f9e","unresolved":false,"context_lines":[{"line_number":372,"context_line":"* We should document the security problems that still exist, even with cleaning"},{"line_number":373,"context_line":"  enabled."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"References"},{"line_number":377,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":378,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"3a961159_5707c91c","line":375,"in_reply_to":"3a961159_e177179d","updated":"2015-01-16 16:59:09.000000000","message":"Definitely. That\u0027ll be essential for people to feel comfortable using this.","commit_id":"651dc9f777f22d9c8a61351767e2ab6d55171b02"}],"specs/kilo/support-decommissioning-of-nodes.rst":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"d0cf2e93474fa4e8093991700ab1d8a801bd9016","unresolved":false,"context_lines":[{"line_number":39,"context_line":"  node in \"deleting\" state in Nova for potentially hours, eating up quota."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* The current PXE ramdisk would need to be upgraded to support operations"},{"line_number":42,"context_line":"  like erase_device() which can\u0027t be done over iSCSI."},{"line_number":43,"context_line":"  This will likely require either the Ironic Python Agent or a BMC"},{"line_number":44,"context_line":"  capable of doing the required actions out of band."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_2fc4423f","line":42,"updated":"2014-10-13 10:26:05.000000000","message":"why can\u0027t we modify the pxe ramdisk to zero the disk using iscsi just like we write the image ? isn\u0027t that possible ?","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8f149d4ead3b41eb221ba2a456e1282c910219d4","unresolved":false,"context_lines":[{"line_number":39,"context_line":"  node in \"deleting\" state in Nova for potentially hours, eating up quota."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* The current PXE ramdisk would need to be upgraded to support operations"},{"line_number":42,"context_line":"  like erase_device() which can\u0027t be done over iSCSI."},{"line_number":43,"context_line":"  This will likely require either the Ironic Python Agent or a BMC"},{"line_number":44,"context_line":"  capable of doing the required actions out of band."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_e4588d59","line":42,"in_reply_to":"baa201ad_2fc4423f","updated":"2014-10-14 19:01:15.000000000","message":"Hmm. That probably would work. It\u0027s probably not as secure as possible, but better than nothing.","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"d0cf2e93474fa4e8093991700ab1d8a801bd9016","unresolved":false,"context_lines":[{"line_number":50,"context_line":"  will call to the management interface and/or make calls to the ramdisk"},{"line_number":51,"context_line":"  agent to decommission a node. It will be called by the conductor after"},{"line_number":52,"context_line":"  tear_down. This will give the driver control over the order of operations"},{"line_number":53,"context_line":"  and list of required operations. decom"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":56,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_3d8e3bd1","line":53,"updated":"2014-10-13 10:26:05.000000000","message":"nit: why is there a decom at the end ?","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8f149d4ead3b41eb221ba2a456e1282c910219d4","unresolved":false,"context_lines":[{"line_number":52,"context_line":"  tear_down. This will give the driver control over the order of operations"},{"line_number":53,"context_line":"  and list of required operations. decom"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":56,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"},{"line_number":57,"context_line":"  delete commands from taking hours."},{"line_number":58,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_02ce3d83","line":55,"updated":"2014-10-14 19:01:15.000000000","message":"In reality, it will go from DECOMMISSIONING to NOSTATE, just like you  skip DELETED when going DELETING to NOSTATE. DELETED and DECOMMISSIONED are just target states to signify a node is transitioning/processing.\n\nYou could retry DECOMMISSIONING by putting the node into DECOMMISSIONING state with the API (noted below), or the admin could put it back to NOSTATE. I\u0027ll make that more explicit.","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"d0cf2e93474fa4e8093991700ab1d8a801bd9016","unresolved":false,"context_lines":[{"line_number":52,"context_line":"  tear_down. This will give the driver control over the order of operations"},{"line_number":53,"context_line":"  and list of required operations. decom"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":56,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"},{"line_number":57,"context_line":"  delete commands from taking hours."},{"line_number":58,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_0ff4decd","line":55,"updated":"2014-10-13 10:26:05.000000000","message":"what is the use of DECOMMISSIONED state ? i am assuming there will be nothing to do on the transition from DECOMMISSIONED -\u003e NOSTATE.  is DECOMMISSIONED required at all ? \n\ncan\u0027t we just go from DECOMMISSIONING to NOSTATE ?\n\nAlso another questions is what is the way out for the baremetal node is in DECOMMISSIONFAIL state ? how does it reach NOSTATE, assuming admin fixes the issue which caused DECOMMISSIONFAIL manually? can we retry decommission again at DECOMMISSIONFAIL state ?","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"d0cf2e93474fa4e8093991700ab1d8a801bd9016","unresolved":false,"context_lines":[{"line_number":60,"context_line":"  _wait_for_provision_state() so the node can be removed from a users list"},{"line_number":61,"context_line":"  of active nodes more quickly."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* \u0027decommission_state\u0027 and \u0027decommission_target_state\u0027 will be used in"},{"line_number":64,"context_line":"  driver_info for the node to coordinate reboots and give insight into"},{"line_number":65,"context_line":"  decommission tasks so nodes aren\u0027t rebooted part way through a hard drive"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_4f2fc688","line":63,"updated":"2014-10-13 10:26:05.000000000","message":"why is decomission_state and decomission_target_state required ? is this required to convey more exact details of what decommission is going on in the baremetal ?","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8f149d4ead3b41eb221ba2a456e1282c910219d4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"  _wait_for_provision_state() so the node can be removed from a users list"},{"line_number":61,"context_line":"  of active nodes more quickly."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* \u0027decommission_state\u0027 and \u0027decommission_target_state\u0027 will be used in"},{"line_number":64,"context_line":"  driver_info for the node to coordinate reboots and give insight into"},{"line_number":65,"context_line":"  decommission tasks so nodes aren\u0027t rebooted part way through a hard drive"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_276d139a","line":63,"in_reply_to":"baa201ad_4f2fc688","updated":"2014-10-14 19:01:15.000000000","message":"Correct. In the agent case, the agent loses all context of what step it was on during reboot. In a conductor-driven decommissioning, it is important to keep track of which state the node is in, so that if a conductor dies, the process can continue, rather than restarting. This would be very bad in the case of erase_devices on a big storage node (for example) which could take hours-days to complete.","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"a00aed8df0d2f25bb204318390613e2c9bfa9454","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* If a decommission fails, the node will be put into DECOMMISSIONFAIL state"},{"line_number":68,"context_line":"  and have last_error set appropriately. The node will not be powered off,"},{"line_number":69,"context_line":"  as a power cycle coudl damage a node."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* The decommissioning features will be added behind a config option, to ensure"},{"line_number":72,"context_line":"  operators have the choice to disable the feature if it is unnecessary for"}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_b75dea7b","line":69,"updated":"2014-10-13 07:12:25.000000000","message":"s/coudl/could","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"d0cf2e93474fa4e8093991700ab1d8a801bd9016","unresolved":false,"context_lines":[{"line_number":92,"context_line":"---------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":95,"context_line":"  while the node is in a decommission state."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":98,"context_line":"  provision_state"}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_8f660e28","line":95,"updated":"2014-10-13 10:26:05.000000000","message":"while the node is in DECOMISSIONING state, right ? \n\ncan\u0027t the API be allowed to power off the system in DECOMMISSIONFAIL state ?","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8f149d4ead3b41eb221ba2a456e1282c910219d4","unresolved":false,"context_lines":[{"line_number":92,"context_line":"---------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":95,"context_line":"  while the node is in a decommission state."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":98,"context_line":"  provision_state"}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_47adb787","line":95,"in_reply_to":"baa201ad_8f660e28","updated":"2014-10-14 19:01:15.000000000","message":"Right. \n\nYeah, I think that\u0027s ok for the fail state. At that point, you\u0027ve got to do something to fix the node.","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"d0cf2e93474fa4e8093991700ab1d8a801bd9016","unresolved":false,"context_lines":[{"line_number":94,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":95,"context_line":"  while the node is in a decommission state."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":98,"context_line":"  provision_state"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"RPC API impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_8f08ceda","line":97,"updated":"2014-10-13 10:26:05.000000000","message":"why would we want to put the node directly into decommissioning ? will calling decommission result in calling clean_up() in the driver also - which will perform the cleanup related to conductor node like changing pxe related things, etc. what will be the order of states then ?\n\nACTIVE -\u003e DECOMMISSIONING -\u003e NOSTATE ??","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8f149d4ead3b41eb221ba2a456e1282c910219d4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":95,"context_line":"  while the node is in a decommission state."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":98,"context_line":"  provision_state"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"RPC API impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_a7e023cd","line":97,"in_reply_to":"baa201ad_8f08ceda","updated":"2014-10-14 19:01:15.000000000","message":"I think this is a good first step for newly created nodes. I don\u0027t think this is going to be a common occurrence, but nonetheless should be allowable. Especially since the API defaults to admin-only, we should give ops the tools to manage their hardware as they want. \n\nIf you want tear_down and clean_up to be called on a node, you could put it into DELETED target state, then it would do the decommissioning afterwards.","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"d0cf2e93474fa4e8093991700ab1d8a801bd9016","unresolved":false,"context_lines":[{"line_number":115,"context_line":"* decommission(task) will be added to the DeployInterface. This will be call"},{"line_number":116,"context_line":"  after tear_down by the conductor."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"* I don\u0027t believe this can be supported in the current PXE driver,"},{"line_number":119,"context_line":"  only the agent driver and drivers with hardware BMC support, such as iLO."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"}],"source_content_type":"text/x-rst","patch_set":8,"id":"baa201ad_0f913e9a","line":118,"updated":"2014-10-13 10:26:05.000000000","message":"why is not possible with the current pxe driver ? can\u0027t the pxe ramdisk do the minimum of erasing the disk (possible checking for the disk with the UUID the root partition).","commit_id":"8eccf1fc9a0ea493948c0b73c4596620df45e4cc"},{"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":"7ba3386f0e8889a2330759f368750e3bc8e2f743","unresolved":false,"context_lines":[{"line_number":29,"context_line":"* Other potentially useful tasks would be resetting BIOS,"},{"line_number":30,"context_line":"  ensuring the clock is correct, and others."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Updating firmwares is *not* part of this spec."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"* Some users will require certain security measures be taken before a node"},{"line_number":35,"context_line":"  can be recycled, such as securely erasing disks, which can be implemented"}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_007f1667","line":32,"updated":"2014-10-14 19:33:55.000000000","message":"This is explicitly excluding a very valuable, if not arguably one of the most valuable parts of decom. Why is is explicitly excluded from this spec.","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"7a11bd770bd9150f17cb8516ed10bf4fe93772f7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"* Other potentially useful tasks would be resetting BIOS,"},{"line_number":30,"context_line":"  ensuring the clock is correct, and others."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Updating firmwares is *not* part of this spec."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"* Some users will require certain security measures be taken before a node"},{"line_number":35,"context_line":"  can be recycled, such as securely erasing disks, which can be implemented"}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_5ee9bde4","line":32,"in_reply_to":"baa201ad_007f1667","updated":"2014-10-16 18:07:11.000000000","message":"Sure, but there\u0027s already a firmware spec. I\u0027m not going to spec out how to apply firmwares, but upgrading firmwares should *definitely* be an available option during decom.","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"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":"7ba3386f0e8889a2330759f368750e3bc8e2f743","unresolved":false,"context_lines":[{"line_number":126,"context_line":"  after tear_down by the conductor."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"* I don\u0027t believe this can be supported in the current PXE driver,"},{"line_number":129,"context_line":"  only the agent driver and drivers with hardware BMC support, such as iLO."},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":132,"context_line":"  expected to test their implementation thoroughly."}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_204c1a42","line":129,"updated":"2014-10-14 19:33:55.000000000","message":"Why do you mention supporting erase_devices in the PXE ramdisk on Line 42? These are contradictory...","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"7a11bd770bd9150f17cb8516ed10bf4fe93772f7","unresolved":false,"context_lines":[{"line_number":126,"context_line":"  after tear_down by the conductor."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"* I don\u0027t believe this can be supported in the current PXE driver,"},{"line_number":129,"context_line":"  only the agent driver and drivers with hardware BMC support, such as iLO."},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":132,"context_line":"  expected to test their implementation thoroughly."}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_9e7fa5aa","line":129,"in_reply_to":"baa201ad_204c1a42","updated":"2014-10-16 18:07:11.000000000","message":"Done","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"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":"7ba3386f0e8889a2330759f368750e3bc8e2f743","unresolved":false,"context_lines":[{"line_number":142,"context_line":"* If Nova is upgraded first, nothing will change. The driver will continue"},{"line_number":143,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":146,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":147,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":148,"context_line":"  which takes a large amount of time was enabled and used."}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_a05f2ae4","line":145,"updated":"2014-10-14 19:33:55.000000000","message":"This can be mitigated by disabling decommission if the associated Nova doesn\u0027t support it, eliminating the need for Nova first upgrade ordering.","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"7a11bd770bd9150f17cb8516ed10bf4fe93772f7","unresolved":false,"context_lines":[{"line_number":142,"context_line":"* If Nova is upgraded first, nothing will change. The driver will continue"},{"line_number":143,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":146,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":147,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":148,"context_line":"  which takes a large amount of time was enabled and used."}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_7ea04190","line":145,"in_reply_to":"baa201ad_a05f2ae4","updated":"2014-10-16 18:07:11.000000000","message":"How would Ironic know if Nova supports decom?","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"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":"7ba3386f0e8889a2330759f368750e3bc8e2f743","unresolved":false,"context_lines":[{"line_number":261,"context_line":"  only change existing users/tools may see is an extended period where nodes"},{"line_number":262,"context_line":"  are unabled to be powered off via the API."},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"* Existing drivers can be patched with a stubbed decommission()."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"Documentation Impact"},{"line_number":267,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_a0064acc","line":264,"updated":"2014-10-14 19:33:55.000000000","message":"Anything that implements decommission() as a noop should probably log or generally be loud about it. We don\u0027t want ever for someone to think a node has been cleaned when it hasn\u0027t.","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"7a11bd770bd9150f17cb8516ed10bf4fe93772f7","unresolved":false,"context_lines":[{"line_number":261,"context_line":"  only change existing users/tools may see is an extended period where nodes"},{"line_number":262,"context_line":"  are unabled to be powered off via the API."},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"* Existing drivers can be patched with a stubbed decommission()."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"Documentation Impact"},{"line_number":267,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":9,"id":"baa201ad_1eaf357e","line":264,"in_reply_to":"baa201ad_a0064acc","updated":"2014-10-16 18:07:11.000000000","message":"Done","commit_id":"e9a94c67dc97734f116a382bc3d07d3b9cc89a21"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"ae2971d5f57fa96f22f70cdb9cb3ff5451686426","unresolved":false,"context_lines":[{"line_number":43,"context_line":"* The current PXE ramdisk would support a limited subset of decommissioning"},{"line_number":44,"context_line":"  steps, such as erase_devices(). Steps such as verifying the node\u0027s properties"},{"line_number":45,"context_line":"  will require cooperation of the BMC, Ironic Python Agent, or additions to"},{"line_number":46,"context_line":"  the current ramdisk."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Proposed change"},{"line_number":49,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_998f5223","line":46,"updated":"2014-10-20 23:45:41.000000000","message":"Do you envision all the decom tasks to be performed by ramdisk or some tasks can be performed by driver via BMC? For instance, bios settings.   If everything is going to be performed at IPA ramdisk, will  IPA provide interface for vendor specific plugin to carry out some decom tasks, e..g., bios setting and firmware update, RAID config ...etc.  If some tasks will be performed at driver va BMC, some interfaces maybe needed between IPA and Ironic/driver for coordination.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"daa4d70f2c23c11724271433eeb7d615785501fa","unresolved":false,"context_lines":[{"line_number":43,"context_line":"* The current PXE ramdisk would support a limited subset of decommissioning"},{"line_number":44,"context_line":"  steps, such as erase_devices(). Steps such as verifying the node\u0027s properties"},{"line_number":45,"context_line":"  will require cooperation of the BMC, Ironic Python Agent, or additions to"},{"line_number":46,"context_line":"  the current ramdisk."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Proposed change"},{"line_number":49,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_3dcbb1a6","line":46,"in_reply_to":"9aa7fdbe_998f5223","updated":"2014-10-21 00:42:19.000000000","message":"Heh, funny you should say that. I was just reworking this spec this morning to make cooperation from BMCs/hardware simple. I think IPA provides a good way to do inband things (flashing firmware or erasing an LSI card probably can\u0027t be done out of band). But things like updating IPMI (rotate passwords every decom?) or anything requiring iLo support obviously needs to be out of band. I\u0027m going to let each driver export a list of steps it can perform and then let the conductor or main driver coordinate the steps.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"ae2971d5f57fa96f22f70cdb9cb3ff5451686426","unresolved":false,"context_lines":[{"line_number":52,"context_line":"  will call to the management interface and/or make calls to the ramdisk"},{"line_number":53,"context_line":"  agent to decommission a node. It will be called by the conductor after"},{"line_number":54,"context_line":"  tear_down. This will give the driver control over the order of operations"},{"line_number":55,"context_line":"  and list of required operations."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":58,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_3e5bac55","line":55,"updated":"2014-10-20 23:45:41.000000000","message":"Will a user be able to specify what tasks he/she wants to performed by decommission?  For instance, disk wipe, firmware settings, firmware update, ...etc?  Or is this decided by the driver and user has no choice of what tasks to perform?","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"daa4d70f2c23c11724271433eeb7d615785501fa","unresolved":false,"context_lines":[{"line_number":52,"context_line":"  will call to the management interface and/or make calls to the ramdisk"},{"line_number":53,"context_line":"  agent to decommission a node. It will be called by the conductor after"},{"line_number":54,"context_line":"  tear_down. This will give the driver control over the order of operations"},{"line_number":55,"context_line":"  and list of required operations."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":58,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_fdba09e0","line":55,"in_reply_to":"9aa7fdbe_3e5bac55","updated":"2014-10-21 00:42:19.000000000","message":"With the above bit about steps, each management/deploy driver could (and should) provide config options to enable and disable each step or a group of steps. Adding new, unsupported steps will be challenging and probably an issue for a later spec.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2b0a820250bf6ef642142ced1e2db33b2415f63e","unresolved":false,"context_lines":[{"line_number":70,"context_line":"  They will also allow a conductor that takes over a node to resume at the"},{"line_number":71,"context_line":"  step the node was last on."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"* If a decommission fails, the node will be put into DECOMMISSIONFAIL state"},{"line_number":74,"context_line":"  and have last_error set appropriately. The node will not be powered off,"},{"line_number":75,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":76,"context_line":"  and put the node\u0027s provision_state back to DECOMMISSIONING to retry"}],"source_content_type":"text/x-rst","patch_set":10,"id":"baa201ad_dfb4b583","line":73,"updated":"2014-10-17 13:16:19.000000000","message":"and then put the node in maintenance mode ?","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"daa4d70f2c23c11724271433eeb7d615785501fa","unresolved":false,"context_lines":[{"line_number":70,"context_line":"  They will also allow a conductor that takes over a node to resume at the"},{"line_number":71,"context_line":"  step the node was last on."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"* If a decommission fails, the node will be put into DECOMMISSIONFAIL state"},{"line_number":74,"context_line":"  and have last_error set appropriately. The node will not be powered off,"},{"line_number":75,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":76,"context_line":"  and put the node\u0027s provision_state back to DECOMMISSIONING to retry"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_144a5680","line":73,"in_reply_to":"baa201ad_dfb4b583","updated":"2014-10-21 00:42:19.000000000","message":"Good catch, yes","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2b0a820250bf6ef642142ced1e2db33b2415f63e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"* If a decommission fails, the node will be put into DECOMMISSIONFAIL state"},{"line_number":74,"context_line":"  and have last_error set appropriately. The node will not be powered off,"},{"line_number":75,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":76,"context_line":"  and put the node\u0027s provision_state back to DECOMMISSIONING to retry"},{"line_number":77,"context_line":"  decommissioning or skip to NOSTATE."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"* The decommissioning features will be added behind a config option, to ensure"}],"source_content_type":"text/x-rst","patch_set":10,"id":"baa201ad_bf7e11e2","line":76,"updated":"2014-10-17 13:16:19.000000000","message":"Shouldn\u0027t the operator put the node in DECOMMISSIONED state ?","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"daa4d70f2c23c11724271433eeb7d615785501fa","unresolved":false,"context_lines":[{"line_number":73,"context_line":"* If a decommission fails, the node will be put into DECOMMISSIONFAIL state"},{"line_number":74,"context_line":"  and have last_error set appropriately. The node will not be powered off,"},{"line_number":75,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":76,"context_line":"  and put the node\u0027s provision_state back to DECOMMISSIONING to retry"},{"line_number":77,"context_line":"  decommissioning or skip to NOSTATE."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"* The decommissioning features will be added behind a config option, to ensure"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_54221eba","line":76,"in_reply_to":"baa201ad_bf7e11e2","updated":"2014-10-21 00:42:19.000000000","message":"Yes, and it should be target: DECOMMISSIONED, rather than provision_state.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2b0a820250bf6ef642142ced1e2db33b2415f63e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"Data model impact"},{"line_number":95,"context_line":"-----------------"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"None"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"REST API impact"},{"line_number":100,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"baa201ad_1f047d48","line":97,"updated":"2014-10-17 13:16:19.000000000","message":"isn\u0027t \u0027decommission_state\u0027 and \u0027decommission_target_state\u0027 a change to data model ?","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"72cca79e6536458d0c9b077d6addbc0a7645cf8c","unresolved":false,"context_lines":[{"line_number":94,"context_line":"Data model impact"},{"line_number":95,"context_line":"-----------------"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"None"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"REST API impact"},{"line_number":100,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8c0949_469fe15f","line":97,"in_reply_to":"9aa7fdbe_147336ea","updated":"2014-10-30 18:21:50.000000000","message":"Actually, I\u0027ve very much changed the direction. I think it\u0027ll be a good idea to have this as a new part of the data model, so drivers and operators can have more visibility into the decommission process.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"daa4d70f2c23c11724271433eeb7d615785501fa","unresolved":false,"context_lines":[{"line_number":94,"context_line":"Data model impact"},{"line_number":95,"context_line":"-----------------"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"None"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"REST API impact"},{"line_number":100,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_147336ea","line":97,"in_reply_to":"baa201ad_1f047d48","updated":"2014-10-21 00:42:19.000000000","message":"I currently have those in driver_info as sub keys. I could be convinced to make them new fields if there\u0027s a benefit to doing that.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2b0a820250bf6ef642142ced1e2db33b2415f63e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"  to restart the node to fix it. Ideally this would require a --force flag"},{"line_number":106,"context_line":"  if/when that is added to the API."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":109,"context_line":"  provision_state. The can be useful for verifying newly added nodes or if"},{"line_number":110,"context_line":"  an operator wants to put a fleet of inactive servers into a known state."},{"line_number":111,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"baa201ad_91494162","line":108,"updated":"2014-10-17 13:16:19.000000000","message":"shouldn\u0027t we have the rest api details here ?","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"daa4d70f2c23c11724271433eeb7d615785501fa","unresolved":false,"context_lines":[{"line_number":105,"context_line":"  to restart the node to fix it. Ideally this would require a --force flag"},{"line_number":106,"context_line":"  if/when that is added to the API."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":109,"context_line":"  provision_state. The can be useful for verifying newly added nodes or if"},{"line_number":110,"context_line":"  an operator wants to put a fleet of inactive servers into a known state."},{"line_number":111,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_1dc0ad4f","line":108,"in_reply_to":"baa201ad_91494162","updated":"2014-10-21 00:42:19.000000000","message":"Definitely! I\u0027ll add :)","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2b0a820250bf6ef642142ced1e2db33b2415f63e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"  if/when that is added to the API."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":109,"context_line":"  provision_state. The can be useful for verifying newly added nodes or if"},{"line_number":110,"context_line":"  an operator wants to put a fleet of inactive servers into a known state."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"RPC API impact"}],"source_content_type":"text/x-rst","patch_set":10,"id":"baa201ad_5fa8c51f","line":109,"updated":"2014-10-17 13:16:19.000000000","message":"nit: this can be useful","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"72cca79e6536458d0c9b077d6addbc0a7645cf8c","unresolved":false,"context_lines":[{"line_number":106,"context_line":"  if/when that is added to the API."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* The API will allow users to put a node directly into decommissioning"},{"line_number":109,"context_line":"  provision_state. The can be useful for verifying newly added nodes or if"},{"line_number":110,"context_line":"  an operator wants to put a fleet of inactive servers into a known state."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"RPC API impact"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8c0949_0695d93f","line":109,"in_reply_to":"baa201ad_5fa8c51f","updated":"2014-10-30 18:21:50.000000000","message":"Done","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"ae2971d5f57fa96f22f70cdb9cb3ff5451686426","unresolved":false,"context_lines":[{"line_number":130,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":131,"context_line":"  expected to test their implementation thoroughly."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"* Existing drivers can choose to not implement the new API with no effect."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"Nova driver impact"},{"line_number":136,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_59c40a40","line":133,"updated":"2014-10-20 23:45:41.000000000","message":"I had a few questions earlier.  Pending on the answers, it may need interface to allow users to specify what decom tasks they want, the interface between Ironic and IPA, and IPA plugin interface for vendor to use vendor tools to perform some tasks in IPA.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"daa4d70f2c23c11724271433eeb7d615785501fa","unresolved":false,"context_lines":[{"line_number":130,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":131,"context_line":"  expected to test their implementation thoroughly."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"* Existing drivers can choose to not implement the new API with no effect."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"Nova driver impact"},{"line_number":136,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9aa7fdbe_3db571ee","line":133,"in_reply_to":"9aa7fdbe_59c40a40","updated":"2014-10-21 00:42:19.000000000","message":"I think there will be a base implementation for any functions and that should suffice until drivers choose to add support.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"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":"4946cbb54c06d2caeb1ecc7c9bdcc4f8d2c7e2ea","unresolved":false,"context_lines":[{"line_number":141,"context_line":"* If Nova is upgraded first, nothing will change. The driver will continue"},{"line_number":142,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":145,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":146,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":147,"context_line":"  which takes a large amount of time was enabled and used."}],"source_content_type":"text/x-rst","patch_set":10,"id":"baa201ad_01c0b84e","line":144,"updated":"2014-10-16 18:06:32.000000000","message":"(carried over from last patchset)\n\nThis can be mitigated by disabling decommission if the associated Nova doesn\u0027t support it, eliminating the need for Nova first upgrade ordering.","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b378a4450b4cb395f065446d6c16a56a9e4d83da","unresolved":false,"context_lines":[{"line_number":141,"context_line":"* If Nova is upgraded first, nothing will change. The driver will continue"},{"line_number":142,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":145,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":146,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":147,"context_line":"  which takes a large amount of time was enabled and used."}],"source_content_type":"text/x-rst","patch_set":10,"id":"baa201ad_8192e854","line":144,"in_reply_to":"baa201ad_01c0b84e","updated":"2014-10-16 19:12:26.000000000","message":"(heh you reviewed faster than I could post my comments)\n\nHow would Ironic know if Nova supports decom?","commit_id":"77d781807dabdd59532b3c90ce47488937e07c77"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"7b9c4aabb719ca91c863e01f0c37db6ee978a287","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* Add a new function get_decommission_steps() to all interfaces associated"},{"line_number":56,"context_line":"  with the driver associated with the node, so they may"},{"line_number":57,"context_line":"  register steps for decommissioning. This will be a function to allow drivers"},{"line_number":58,"context_line":"  to conditionally enable and disable steps, either based on environment or"},{"line_number":59,"context_line":"  based on config flags, depending on driver. This may return None or [] to"},{"line_number":60,"context_line":"  not register any steps."}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_0d1df40f","line":57,"updated":"2014-10-30 21:44:14.000000000","message":"could you clarify the first sentence. maybe list the effected interfaces.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"a8a0fabd56b8e192f7b7a65b98291a7b02eee356","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* Add a new function get_decommission_steps() to all interfaces associated"},{"line_number":56,"context_line":"  with the driver associated with the node, so they may"},{"line_number":57,"context_line":"  register steps for decommissioning. This will be a function to allow drivers"},{"line_number":58,"context_line":"  to conditionally enable and disable steps, either based on environment or"},{"line_number":59,"context_line":"  based on config flags, depending on driver. This may return None or [] to"},{"line_number":60,"context_line":"  not register any steps."}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_f4ba1ee0","line":57,"in_reply_to":"7a8c0949_0d1df40f","updated":"2014-10-31 21:36:43.000000000","message":"I\u0027ll add that, because yeah, that sentence is pretty bad :) I\u0027m thinking Deploy, Management and possibly Power interfaces will get it. When Boot gets broken out into its own interface, it probably doesn\u0027t need these functions either.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"2e866b895282380f1798e75b6170a469a15c558e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  register steps for decommissioning. This will be a function to allow drivers"},{"line_number":58,"context_line":"  to conditionally enable and disable steps, either based on environment or"},{"line_number":59,"context_line":"  based on config flags, depending on driver. This may return None or [] to"},{"line_number":60,"context_line":"  not register any steps."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* The return value of get_decommission_steps() will be a list of dicts"},{"line_number":63,"context_line":"  in the form:"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_ef2b27e9","line":60,"updated":"2014-11-01 01:01:37.000000000","message":"Why do we need this function? I think if the interface don\u0027t want to take action for a step, it can simply NOP and return when called with execute_decommision_step, right?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b514007d28339450583ec196597501e151ac7f88","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  register steps for decommissioning. This will be a function to allow drivers"},{"line_number":58,"context_line":"  to conditionally enable and disable steps, either based on environment or"},{"line_number":59,"context_line":"  based on config flags, depending on driver. This may return None or [] to"},{"line_number":60,"context_line":"  not register any steps."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* The return value of get_decommission_steps() will be a list of dicts"},{"line_number":63,"context_line":"  in the form:"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_d5551c1e","line":60,"in_reply_to":"7a8c0949_ef2b27e9","updated":"2014-11-01 18:29:30.000000000","message":"But how would you know which functions to call? This involves cross driver function calling.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"2e866b895282380f1798e75b6170a469a15c558e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"  in the form:"},{"line_number":64,"context_line":"  ["},{"line_number":65,"context_line":"    {"},{"line_number":66,"context_line":"      \u0027step\u0027: \u0027step_name\u0027, // arbitrary, opaque name"},{"line_number":67,"context_line":"      \u0027priority\u0027: an int or float, with the lowest priority steps being run"},{"line_number":68,"context_line":"                  first. A list of proposed groupings is below.,"},{"line_number":69,"context_line":"      \u0027driver\u0027: \u0027driver_interface_name\u0027 // the name as registe"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_4f899bea","line":66,"updated":"2014-11-01 01:01:37.000000000","message":"Do you think we should define standard, well-defined steps, instead of arbitrary steps, and a driver simply report that if it support or un-support these steps.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d93584bcf96f7fd5f98c9d64663d183ff82e0fa6","unresolved":false,"context_lines":[{"line_number":63,"context_line":"  in the form:"},{"line_number":64,"context_line":"  ["},{"line_number":65,"context_line":"    {"},{"line_number":66,"context_line":"      \u0027step\u0027: \u0027step_name\u0027, // arbitrary, opaque name"},{"line_number":67,"context_line":"      \u0027priority\u0027: an int or float, with the lowest priority steps being run"},{"line_number":68,"context_line":"                  first. A list of proposed groupings is below.,"},{"line_number":69,"context_line":"      \u0027driver\u0027: \u0027driver_interface_name\u0027 // the name as registe"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_40bbf371","line":66,"in_reply_to":"7a8c0949_32773d3c","updated":"2014-11-07 13:22:35.000000000","message":"The main thing causing the issues here is that we need to support out of band, hardware specific operations and in band, \"should work on most hardware\" commands AND hardware specific commands, especially on hardware with minimal BMCs (OpenCompute in my case, which does very little). \n\nSo one of our steps is \"unlocking\" the BIOS with a specific set of steps (very vendor specific) so that we may apply a new BIOS/settings, and then another step where we \"lock\" the BIOS at the end. I doubt anyone else would need these steps as they\u0027re fairly specific to work we had to do with our vendor to hit some security concerns we had running a multitenant environment. The rest are fairly standard, and should work on most hardware.\n\nHow would you handle updating firmware for multiple devices? Just a broad \"update firmware\" function that updates all the firmwares? What if you need (and you probably do) some reboots during those updates? One \"update firmware\" function defined per possible device? Configuring those devices as the settings may have been changed by the tenant? \n\nAs far as arbitrary/opaque steps, I think you\u0027re right, at least for out of band. In band is going to be odd, because it\u0027s going to rely on bundled vendor tools. I think for the out of band and management interface ones functions, those will be static functions, and we can use a decorator that does registration of decom steps, priority (a config option, which can be set to 0 to disable). This would be very similar to how the periodic task decorator works (it registers the functions similarly), like here https://github.com/openstack/ironic/blob/master/ironic/conductor/manager.py#L787. \n\nFor in band, it\u0027ll need to be something where it queries the ramdisk to get that list of steps, register them, prioritize, etc, at least for the first pass. There\u0027s no simple way to provide config options in IPA in Ironic configs, but those facilities already exist for packaging required vendor tools and setting priority for steps, etc.\n\nAs far as environmental configuration goes, if RAID firmware update is enabled via config, and the node doesn\u0027t have a RAID card, that gets skipped. This can be accomplished with querying the out of band or the hardware capabilities spec upcoming.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"12492ad00fa99c2c20353c306cc727442155a46b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"  in the form:"},{"line_number":64,"context_line":"  ["},{"line_number":65,"context_line":"    {"},{"line_number":66,"context_line":"      \u0027step\u0027: \u0027step_name\u0027, // arbitrary, opaque name"},{"line_number":67,"context_line":"      \u0027priority\u0027: an int or float, with the lowest priority steps being run"},{"line_number":68,"context_line":"                  first. A list of proposed groupings is below.,"},{"line_number":69,"context_line":"      \u0027driver\u0027: \u0027driver_interface_name\u0027 // the name as registe"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5a890539_d0c72263","line":66,"in_reply_to":"7a8c0949_40bbf371","updated":"2014-11-07 18:24:26.000000000","message":"Thanks for the detailed explanation, to show the complex of the in-band support.\n\nIMHO, it will be better if we can keep these complex inside the  in-bound driver, and provide generic/static steps in the base driver layer. For example, the \u0027lock bios\u0027 is part of the decommission preparation. \n\nBut I think that possibly can be done in future, the decommission is complex enough already :)","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b514007d28339450583ec196597501e151ac7f88","unresolved":false,"context_lines":[{"line_number":63,"context_line":"  in the form:"},{"line_number":64,"context_line":"  ["},{"line_number":65,"context_line":"    {"},{"line_number":66,"context_line":"      \u0027step\u0027: \u0027step_name\u0027, // arbitrary, opaque name"},{"line_number":67,"context_line":"      \u0027priority\u0027: an int or float, with the lowest priority steps being run"},{"line_number":68,"context_line":"                  first. A list of proposed groupings is below.,"},{"line_number":69,"context_line":"      \u0027driver\u0027: \u0027driver_interface_name\u0027 // the name as registe"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_f531380c","line":66,"in_reply_to":"7a8c0949_4f899bea","updated":"2014-11-01 18:29:30.000000000","message":"No, definitely not. I wouldn\u0027t want to limit deployers who need something specific for their hardware. I imagine the needs of OnMetal are different than someone using a SeaMicro box, and both are different than what a small, internal use deployer would need. For example, in the version I have deployed downstream, we already have 8 steps in the agent, and some are pretty specific to our hardware/firmware signing process.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"87a1919db63cb5e0860e1f5cd2c185d69f08a129","unresolved":false,"context_lines":[{"line_number":63,"context_line":"  in the form:"},{"line_number":64,"context_line":"  ["},{"line_number":65,"context_line":"    {"},{"line_number":66,"context_line":"      \u0027step\u0027: \u0027step_name\u0027, // arbitrary, opaque name"},{"line_number":67,"context_line":"      \u0027priority\u0027: an int or float, with the lowest priority steps being run"},{"line_number":68,"context_line":"                  first. A list of proposed groupings is below.,"},{"line_number":69,"context_line":"      \u0027driver\u0027: \u0027driver_interface_name\u0027 // the name as registe"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_32773d3c","line":66,"in_reply_to":"7a8c0949_f531380c","updated":"2014-11-04 19:27:43.000000000","message":"Totally agree that OnMetal and SeaMicro may have different \"something specific\", but will they have similar step, like clear BIOS setting, flush BIOS, erase disk etc?  The only difference is, they have different operation to achieve these steps. Or, can you please provide more detailed information of the 8 steps in the agent?\n\nI\u0027m just a bit lost how the arbitrary/opaque steps can support steps definition/configuration. As the first bullet said, \" driver conditionally enable and disable steps, either based on environment or\tbased on config flags\" and below bullet said \"drivers can choose to make priority configurable using config options if they desire\" . However, the driver has no idea of the steps will be supported by the interface, how can it decide enable/disable steps. Also, if different interfaces for one driver will provide arbitrary different steps, how can the driver co-operate these different steps among different interface?\n\nThe decommission is sure to be cool, just want to know how such arbitrary defined steps will compose a clear architect.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"2e866b895282380f1798e75b6170a469a15c558e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":88,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":89,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":90,"context_line":"  then the deploy driver\u0027s step."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":93,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_af775f01","line":90,"updated":"2014-11-01 01:01:37.000000000","message":"Who will provide the priority information? This section is a bit confused to me, can you give some usage case?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"87a1919db63cb5e0860e1f5cd2c185d69f08a129","unresolved":false,"context_lines":[{"line_number":87,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":88,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":89,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":90,"context_line":"  then the deploy driver\u0027s step."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":93,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_b2b16de3","line":90,"in_reply_to":"7a8c0949_9522b4b7","updated":"2014-11-04 19:27:43.000000000","message":"Possibly I\u0027m wrong with the \u0027driver\u0027 and \u0027interface\u0027. When you talking about \" Each driver will set a default priority for each step they register\", you in fact mean it\u0027s interface, right? \n\nAlso, when saying \"make a config option for the priority of that step\", you previously stated that the steps will be arbitrary/opaque name, how can a config option defined for an arbitrary/opaque name?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b514007d28339450583ec196597501e151ac7f88","unresolved":false,"context_lines":[{"line_number":87,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":88,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":89,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":90,"context_line":"  then the deploy driver\u0027s step."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":93,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_9522b4b7","line":90,"in_reply_to":"7a8c0949_af775f01","updated":"2014-11-01 18:29:30.000000000","message":"I agree, it\u0027s a bit unclear. Each driver will set a default priority for each step they register. I\u0027d encourage each developer (and I intend to for any functions I add) make a config option for the priority of that step, so operators can change it as necessary. This becomes a bit more complex with things like the agent driver and custom IPA hardware managers registering their own steps, so I don\u0027t think it should be a strict requirement to have a config option for each decom step, but certainly encouraged.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d93584bcf96f7fd5f98c9d64663d183ff82e0fa6","unresolved":false,"context_lines":[{"line_number":87,"context_line":"  the tie breaker will be the driver implementing the function, in the order"},{"line_number":88,"context_line":"  power, management, deploy drivers. So if the power and deploy driver both"},{"line_number":89,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":90,"context_line":"  then the deploy driver\u0027s step."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":93,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_0403ad42","line":90,"in_reply_to":"7a8c0949_b2b16de3","updated":"2014-11-07 13:22:35.000000000","message":"Heh you\u0027re right. A driver is composed of multiple interfaces, and they get used interchangeably (agent driver is really the agent deploy interface). \n\nSee above.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"2e866b895282380f1798e75b6170a469a15c558e","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":93,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"},{"line_number":94,"context_line":"  delete commands from taking hours."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"* DECOMMISSIONED with be a target state only, much like DELETED."},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_2f0d2f91","line":94,"updated":"2014-11-01 01:01:37.000000000","message":"What\u0027s your \"list of states\"? You mean the \"Provision state\", am I right?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b514007d28339450583ec196597501e151ac7f88","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"* Add DECOMMISSIONING, DECOMMISSIONED, and DECOMMISSIONFAIL to the list of"},{"line_number":93,"context_line":"  states, which occurs between DELETED and NOSTATE. This will prevent Nova"},{"line_number":94,"context_line":"  delete commands from taking hours."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"* DECOMMISSIONED with be a target state only, much like DELETED."},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_55412c59","line":94,"in_reply_to":"7a8c0949_2f0d2f91","updated":"2014-11-01 18:29:30.000000000","message":"Correct.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"1eb6e84b5d87db4df34f0d2c734405908e8f193b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"Data model impact"},{"line_number":152,"context_line":"-----------------"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"REST API impact"},{"line_number":157,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_616aa082","line":154,"updated":"2014-11-07 14:11:27.000000000","message":"The decommission step should be recorded here, rather than in driver_info.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"2e866b895282380f1798e75b6170a469a15c558e","unresolved":false,"context_lines":[{"line_number":185,"context_line":"because it is mostly internal conductor and driver calls. If the API is"},{"line_number":186,"context_line":"upgraded before the conductor and attempts to put a node into provision_state"},{"line_number":187,"context_line":"\"decommissioned\", the API will return an error that it isn\u0027t supported."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"Driver API impact"},{"line_number":191,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_2f844fd3","line":188,"updated":"2014-11-01 01:01:37.000000000","message":"A curios question. Does Ironic has any suggestion on the upgrade steps? IMHO, I think the conductor should be updated before the API?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d93584bcf96f7fd5f98c9d64663d183ff82e0fa6","unresolved":false,"context_lines":[{"line_number":185,"context_line":"because it is mostly internal conductor and driver calls. If the API is"},{"line_number":186,"context_line":"upgraded before the conductor and attempts to put a node into provision_state"},{"line_number":187,"context_line":"\"decommissioned\", the API will return an error that it isn\u0027t supported."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"Driver API impact"},{"line_number":191,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_db5fd8e3","line":188,"in_reply_to":"7a8c0949_12c6c149","updated":"2014-11-07 13:22:35.000000000","message":"I very much agree, probably because our team assists in the development and deploy process :) I\u0027ll check to make sure, but any patches I make will attempt to be upgrade order agnostic.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b514007d28339450583ec196597501e151ac7f88","unresolved":false,"context_lines":[{"line_number":185,"context_line":"because it is mostly internal conductor and driver calls. If the API is"},{"line_number":186,"context_line":"upgraded before the conductor and attempts to put a node into provision_state"},{"line_number":187,"context_line":"\"decommissioned\", the API will return an error that it isn\u0027t supported."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"Driver API impact"},{"line_number":191,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_d52c3cae","line":188,"in_reply_to":"7a8c0949_2f844fd3","updated":"2014-11-01 18:29:30.000000000","message":"I\u0027m not sure on our docs, but all deploys, in every case possible, shouldn\u0027t rely on the ordering of upgrades, because that\u0027s a huge pain for operators.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"87a1919db63cb5e0860e1f5cd2c185d69f08a129","unresolved":false,"context_lines":[{"line_number":185,"context_line":"because it is mostly internal conductor and driver calls. If the API is"},{"line_number":186,"context_line":"upgraded before the conductor and attempts to put a node into provision_state"},{"line_number":187,"context_line":"\"decommissioned\", the API will return an error that it isn\u0027t supported."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"Driver API impact"},{"line_number":191,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_12c6c149","line":188,"in_reply_to":"7a8c0949_d52c3cae","updated":"2014-11-04 19:27:43.000000000","message":"Aha, it\u0027s sure to be cool if we don\u0027t rely on upgrade ordering. I know Nova has strict definition of the order and I thought we are same here :)","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"7b9c4aabb719ca91c863e01f0c37db6ee978a287","unresolved":false,"context_lines":[{"line_number":240,"context_line":"------------------"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"* Nova driver will look for the decommission states when determining if"},{"line_number":243,"context_line":"  unprovisioning succeeded or not."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"* If Nova is upgraded first, nothing will change. The driver will continue"},{"line_number":246,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_adca209f","line":243,"updated":"2014-10-30 21:44:14.000000000","message":"Will these states also be used to determine node availability?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"a8a0fabd56b8e192f7b7a65b98291a7b02eee356","unresolved":false,"context_lines":[{"line_number":240,"context_line":"------------------"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"* Nova driver will look for the decommission states when determining if"},{"line_number":243,"context_line":"  unprovisioning succeeded or not."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"* If Nova is upgraded first, nothing will change. The driver will continue"},{"line_number":246,"context_line":"  to be in the tear_down state until the node goes to NOSTATE."}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_f45e9ee8","line":243,"in_reply_to":"7a8c0949_adca209f","updated":"2014-10-31 21:36:43.000000000","message":"Oh, duh! Yes! It won\u0027t require any code changes IIRC, because the driver has an inclusive list of acceptable states to deploy to, rather than an exclusive list of states that can\u0027t be deployed to. Either way, it should definitely be called out in the spec.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"2e866b895282380f1798e75b6170a469a15c558e","unresolved":false,"context_lines":[{"line_number":248,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":249,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":250,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":251,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"Security impact"},{"line_number":254,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_8fd8e3f0","line":251,"updated":"2014-11-01 01:01:37.000000000","message":"This is a concern because it may impact the user experience a lot. Yes, it will only happen in the update time, and it will not broken the update at least.\n\nI think the issue comes from how we define the decommission.  Of course, we can understand the decommission is part of the unprovision step, but we can also understand the decommission as part of the preparation step. For example, if we consider the decommission as a maintenance effort, then the story will be different. Take renting car as example, when we return a car to Hertz, the process will be, the Hertz worker will get back the key, check if anything wrong, if everything ok, then the renter is done. This just like our unprovision. After the guest leaves, Hertz may clean the car, drop anything left by previous renter, restore setting changed by previous renter, to make sure the car is ready for next user. This is like our decommission. The renter never knows about the maintanence/decommission.\n\nTake this as example, would it be better to keep the decommision as part of maintainence? We take the node lock, set the provision_state as None, mark the node as maintanence,  set the maintanence reason as \"decommission\" (after that BP is approved), trigger the decommsion action. Would this will be better?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b514007d28339450583ec196597501e151ac7f88","unresolved":false,"context_lines":[{"line_number":248,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":249,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":250,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":251,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"Security impact"},{"line_number":254,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_b506d01e","line":251,"in_reply_to":"7a8c0949_8fd8e3f0","updated":"2014-11-01 18:29:30.000000000","message":"Decommissioning can be enabled and disabled via a config option (noted above, let\u0027s call it decommission_on_tear_down). I think it\u0027s reasonable to ignore that config option if a node has it\u0027s target provision state set to DECOMMISSIONED. So for the use case you describe, set decommission_on_tear_down\u003dFalse, and set maintenanced node to decom whenever you need. For your analogy to make sense, the renter would have to be leaving a bunch of personal information all over the car. In that case, I\u0027d very much hope Hertz removed it before giving it to another client! In my opinion, decom should be run every tear down, and at a minimum, erase the disks in a secure fashion. This is critical in a multitenant environment, and I\u0027d argue extremely important even for internal only hardware clouds. I haven\u0027t worked at a company that shuffled hardware between users (even all internal) without erasing the disks at a minimum.\n\nThe other key point here is automation. I\u0027d rather have automated decom than having an external script or something decide when a node is decommed. That leaves a race condition where a node could be unprovisioned and provisioned again before the script notices (especially in near capacity situations), which I view as unacceptable for many users.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"87a1919db63cb5e0860e1f5cd2c185d69f08a129","unresolved":false,"context_lines":[{"line_number":248,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":249,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":250,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":251,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"Security impact"},{"line_number":254,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_f2269515","line":251,"in_reply_to":"7a8c0949_b506d01e","updated":"2014-11-04 19:27:43.000000000","message":"Hi, Josh, sorry if I didn\u0027t express myself clearly in previous statement. My key point is, the relationship of the decommission and provision is, the provision is sure to trigger a decommission, but the decommission is not part of provision process, it\u0027s a separated operation/steps.\n\nAnd the better place for this decommission is \u0027maintenance\u0027. Decommission, IMHO, is part of maintenance effort to put a node to a expected, clean status.\n\nThis separation IMHO is cleaner and will bring some benefit. First, the admin may requires decommission for other situation, like when a node firstly added (this is sure not part of provision), after a node is power-on, or even triggered by some hot-plug operation in the compute node. Second, with a separate operation, it can have more action, for example, a iscsi deploy may provide a separate ramdisk, like decommision-ramdisk, instead of deploy-ramdisk, to achive it.\n\nYour opinion?","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"12492ad00fa99c2c20353c306cc727442155a46b","unresolved":false,"context_lines":[{"line_number":248,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":249,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":250,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":251,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"Security impact"},{"line_number":254,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5a890539_d0c3a236","line":251,"in_reply_to":"7a8c0949_be891728","updated":"2014-11-07 18:24:26.000000000","message":"Thanks for lengthy reply.I\u0027m not suggesting \u0027decom outside of Ironic\u0027, I simply think it\u0027s better to decouple the decom from the provision, decom is in fact make the machine to be ready-state and it can happen not only in the end of the deployment.\n\nBut I\u0027d postpone this discussion till the decom is implemented in Ironic and we do have other requirement to decom other than in the end of provision process. \n\nThanks.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"d93584bcf96f7fd5f98c9d64663d183ff82e0fa6","unresolved":false,"context_lines":[{"line_number":248,"context_line":"* If Ironic is updated first, nodes that are torn down may take additional"},{"line_number":249,"context_line":"  time and will likely time out in unprovision. This would only happen if"},{"line_number":250,"context_line":"  Ironic was updated before Nova, and a driver that implements decommission"},{"line_number":251,"context_line":"  which takes a large amount of time was enabled and used."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"Security impact"},{"line_number":254,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_be891728","line":251,"in_reply_to":"7a8c0949_f2269515","updated":"2014-11-07 13:22:35.000000000","message":"I still completely disagree. Decom happens after provision if the config option is set. Having to orchestrate decom outside of Ironic is painful and less effective. If an operator wants to do it that way, they can flip the config option that\u0027ll disable decom and handle it. It\u0027s much easier to do that than somehow shoehorning this in on every node delete with some external service. If you\u0027re only considering decom as firmware upgrades, sure, that might be ok. But secure erase (or at least some erasing!) makes this essential in many environments on every tear down. \n\nI don\u0027t see any benefit to doing it that way, as long as the operator can disable it happening automatically. Booting different ramdisks would involve something like switching drivers for the node? Or a decom interface using a different decom ramdisk? The first is a pretty significant change to Ironic\u0027s, the second is a hard problem due to decom being a combination of the node\u0027s assigned deploy and management interfaces (in and out of band). Personally, I\u0027d rather spend that time on making IPA support iSCSI and being the ramdisk for the PXE driver than supporting switching ramdisks for deploy/decom (but I\u0027m pretty biased there!)","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"7b9c4aabb719ca91c863e01f0c37db6ee978a287","unresolved":false,"context_lines":[{"line_number":283,"context_line":"  decommissioning steps. The steps could take hours,"},{"line_number":284,"context_line":"  which will mean the time to recycle could be much higher than before."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"* The node will be locked for the duration of the decommissioning."},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"* Database calls will increase, because the state is saved after each"},{"line_number":289,"context_line":"  decommissioning step that requires a reboot or long running process."}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_adf30009","line":286,"updated":"2014-10-30 21:44:14.000000000","message":"we may want to point out that the above may / will (depending on decom time) impact the nova resource recycle time.","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"a8a0fabd56b8e192f7b7a65b98291a7b02eee356","unresolved":false,"context_lines":[{"line_number":283,"context_line":"  decommissioning steps. The steps could take hours,"},{"line_number":284,"context_line":"  which will mean the time to recycle could be much higher than before."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"* The node will be locked for the duration of the decommissioning."},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"* Database calls will increase, because the state is saved after each"},{"line_number":289,"context_line":"  decommissioning step that requires a reboot or long running process."}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a8c0949_3442e610","line":286,"in_reply_to":"7a8c0949_adf30009","updated":"2014-10-31 21:36:43.000000000","message":"good point!","commit_id":"fe3bcbe2e133ba8449743a34786660e15ce8c86d"}],"specs/kilo/support-zapping-of-nodes.rst":[{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"3db0ff91f6306b64a7fe9649c55fdcd05a5b0ae0","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"* At a minimum, hard drives should be erased (if preserve ephemeral isn\u0027t"},{"line_number":35,"context_line":"  set on the node. Handling this should be implemented by the drivers that"},{"line_number":36,"context_line":"  provide erase devices as a step)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Other potentially useful tasks would be resetting BIOS, applying BIOS"},{"line_number":39,"context_line":"  settings (uniform settings for all nodes, rather than individually on each"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_604c5cc9","line":36,"updated":"2014-11-13 18:47:19.000000000","message":"Is \"preserve ephemeral\" a node-level option? I know that having an ephemeral partition is node-level, but the option to preserve that is only found from the rebuild process, AFAIK.\n\nIf a node is being decommissioned, even the ephemeral part should be wiped IMO.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"* At a minimum, hard drives should be erased (if preserve ephemeral isn\u0027t"},{"line_number":35,"context_line":"  set on the node. Handling this should be implemented by the drivers that"},{"line_number":36,"context_line":"  provide erase devices as a step)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Other potentially useful tasks would be resetting BIOS, applying BIOS"},{"line_number":39,"context_line":"  settings (uniform settings for all nodes, rather than individually on each"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_83edd2b9","line":36,"in_reply_to":"5a890539_604c5cc9","updated":"2014-11-13 19:49:43.000000000","message":"Ah you\u0027re right, it\u0027s passed as a flag to nova rebuild (if I\u0027m reading the docs correctly), so nothing to do with the node.\n\nWe should definitely skip zapping on rebuild, or rebuild could take hours :) I\u0027d love to hear if anyone disagrees though.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c9f4a3ea26f380feb6874c1a2e28892e5e5fb715","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"* At a minimum, hard drives should be erased (if preserve ephemeral isn\u0027t"},{"line_number":35,"context_line":"  set on the node. Handling this should be implemented by the drivers that"},{"line_number":36,"context_line":"  provide erase devices as a step)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Other potentially useful tasks would be resetting BIOS, applying BIOS"},{"line_number":39,"context_line":"  settings (uniform settings for all nodes, rather than individually on each"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_c3709174","line":36,"in_reply_to":"5a890539_76896274","updated":"2014-11-14 22:00:01.000000000","message":"I agree with SpamapS, we would should skip zapping on rebuilds.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4493c90a6e4da84737c413627aa1dc05619ce47e","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"* At a minimum, hard drives should be erased (if preserve ephemeral isn\u0027t"},{"line_number":35,"context_line":"  set on the node. Handling this should be implemented by the drivers that"},{"line_number":36,"context_line":"  provide erase devices as a step)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Other potentially useful tasks would be resetting BIOS, applying BIOS"},{"line_number":39,"context_line":"  settings (uniform settings for all nodes, rather than individually on each"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_76896274","line":36,"in_reply_to":"5a890539_83edd2b9","updated":"2014-11-14 16:51:08.000000000","message":"Yes skip zap on rebuild. The point of rebuild is to write a new image without giving up any of the resources.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2d18296617d89f5d552bb550424395c381fede16","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"* At a minimum, hard drives should be erased (if preserve ephemeral isn\u0027t"},{"line_number":35,"context_line":"  set on the node. Handling this should be implemented by the drivers that"},{"line_number":36,"context_line":"  provide erase devices as a step)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Other potentially useful tasks would be resetting BIOS, applying BIOS"},{"line_number":39,"context_line":"  settings (uniform settings for all nodes, rather than individually on each"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_8f9dc7be","line":36,"in_reply_to":"5a890539_c3709174","updated":"2014-11-14 22:38:48.000000000","message":"Works for me!","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c9f4a3ea26f380feb6874c1a2e28892e5e5fb715","unresolved":false,"context_lines":[{"line_number":45,"context_line":"  band systems that support it."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"* If this is implemented without a new zap state, users will see a"},{"line_number":48,"context_line":"  node in \"deleting\" state in Nova for potentially hours, eating up quota."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"* The current PXE ramdisk would support a limited subset of zapping"},{"line_number":51,"context_line":"  steps, such as erase_devices(). Steps such as verifying the node\u0027s properties"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_f4b6253d","line":48,"updated":"2014-11-14 22:00:01.000000000","message":"This is good information to point out, However adding the new states is called for under the \"work items\" section, so maybe better if moved to be a comment under the Dependencies section where the new state machine review is referenced.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2d18296617d89f5d552bb550424395c381fede16","unresolved":false,"context_lines":[{"line_number":45,"context_line":"  band systems that support it."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"* If this is implemented without a new zap state, users will see a"},{"line_number":48,"context_line":"  node in \"deleting\" state in Nova for potentially hours, eating up quota."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"* The current PXE ramdisk would support a limited subset of zapping"},{"line_number":51,"context_line":"  steps, such as erase_devices(). Steps such as verifying the node\u0027s properties"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_6f509bd4","line":48,"in_reply_to":"5a890539_f4b6253d","updated":"2014-11-14 22:38:48.000000000","message":"Good call.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"Proposed change"},{"line_number":56,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* Add a decorator `@zap_step(priority, enable\u003dTrue)` to decorate steps that"},{"line_number":59,"context_line":"  should be run as a part of ZAPPING. priority is the priority in which the"},{"line_number":60,"context_line":"  step will be run, starting from 1. E.g. a function with priority 1 will run"},{"line_number":61,"context_line":"  first, then a step with priority 10, etc. enable is a boolean which will"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_f742e60e","line":58,"updated":"2014-11-13 11:46:46.000000000","message":"Where will @zap_step() be available ? In BaseDriver ?","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"Proposed change"},{"line_number":56,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* Add a decorator `@zap_step(priority, enable\u003dTrue)` to decorate steps that"},{"line_number":59,"context_line":"  should be run as a part of ZAPPING. priority is the priority in which the"},{"line_number":60,"context_line":"  step will be run, starting from 1. E.g. a function with priority 1 will run"},{"line_number":61,"context_line":"  first, then a step with priority 10, etc. enable is a boolean which will"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_c3a8ba8f","line":58,"in_reply_to":"5a890539_f742e60e","updated":"2014-11-13 19:49:43.000000000","message":"Either there or a separate library in common/. I\u0027d lean towards in BaseDriver, as that should be the only place it\u0027d be used.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"70b92932ac256ef4391208ee8e51b62c19128e38","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. enable is a boolean which will"},{"line_number":62,"context_line":"  determine whether the step is run globally or not. I expect in most cases"},{"line_number":63,"context_line":"  both will take a config option as the arg, e.g."},{"line_number":64,"context_line":"  `priority\u003dCONF.driver.step_priority` and `enable\u003dCONF.driver.enable_step` to"},{"line_number":65,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_233c1ec8","line":64,"updated":"2014-11-13 18:59:35.000000000","message":"A bit confused by this. I understand the priority thing, but with this example (getting priority value from CONF), all steps would have the same priority level. Or is \"step_priority\" a wildcard name? Or will each step have its own config section?","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. enable is a boolean which will"},{"line_number":62,"context_line":"  determine whether the step is run globally or not. I expect in most cases"},{"line_number":63,"context_line":"  both will take a config option as the arg, e.g."},{"line_number":64,"context_line":"  `priority\u003dCONF.driver.step_priority` and `enable\u003dCONF.driver.enable_step` to"},{"line_number":65,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_63ef06ea","line":64,"in_reply_to":"5a890539_233c1ec8","updated":"2014-11-13 19:49:43.000000000","message":"I was thinking each step will have its own config options (priority and enable). Though now that I say that, it sounds silly, as each could just have priority, with priority\u003d0 meaning it isn\u0027t run. I should have prefixed it like \"CONF.driver.$step_priority\" and \"CONF.driver.enable_$step\".","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c9f4a3ea26f380feb6874c1a2e28892e5e5fb715","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. enable is a boolean which will"},{"line_number":62,"context_line":"  determine whether the step is run globally or not. I expect in most cases"},{"line_number":63,"context_line":"  both will take a config option as the arg, e.g."},{"line_number":64,"context_line":"  `priority\u003dCONF.driver.step_priority` and `enable\u003dCONF.driver.enable_step` to"},{"line_number":65,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_b94016a6","line":64,"in_reply_to":"5a890539_63ef06ea","updated":"2014-11-14 22:00:01.000000000","message":"may be worth having an overall zapping enable/disable switch, but I think with the ability to disable each individual step with a 0 (zero) priority having both on each step is overkill. Also i think it is worth pointing out that steps can be disabled with a 0 priority.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2d18296617d89f5d552bb550424395c381fede16","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. enable is a boolean which will"},{"line_number":62,"context_line":"  determine whether the step is run globally or not. I expect in most cases"},{"line_number":63,"context_line":"  both will take a config option as the arg, e.g."},{"line_number":64,"context_line":"  `priority\u003dCONF.driver.step_priority` and `enable\u003dCONF.driver.enable_step` to"},{"line_number":65,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_0f747766","line":64,"in_reply_to":"5a890539_b94016a6","updated":"2014-11-14 22:38:48.000000000","message":"I have the overall switch called out a few points down. I\u0027ll kill off enable_step, because yeah it\u0027s overkill. +1 on calling it out.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c9f4a3ea26f380feb6874c1a2e28892e5e5fb715","unresolved":false,"context_lines":[{"line_number":67,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"},{"line_number":68,"context_line":"  base implementation will get a list of functions decorated with"},{"line_number":69,"context_line":"  `@zap_step`, determine which are enabled, and then return a list of"},{"line_number":70,"context_line":"  dictionaries reperesenting each step, sorted by priority."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"* The return value of `get_zap_steps()` will be a list of dicts"},{"line_number":73,"context_line":"  in the form:"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_f9745eff","line":70,"updated":"2014-11-14 22:00:01.000000000","message":"would this only return steps with a priority \u003e zero?","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2d18296617d89f5d552bb550424395c381fede16","unresolved":false,"context_lines":[{"line_number":67,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"},{"line_number":68,"context_line":"  base implementation will get a list of functions decorated with"},{"line_number":69,"context_line":"  `@zap_step`, determine which are enabled, and then return a list of"},{"line_number":70,"context_line":"  dictionaries reperesenting each step, sorted by priority."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"* The return value of `get_zap_steps()` will be a list of dicts"},{"line_number":73,"context_line":"  in the form:"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_cf6b501c","line":70,"in_reply_to":"5a890539_f9745eff","updated":"2014-11-14 22:38:48.000000000","message":"I think it should, yes, to avoid confusing the operator on which steps are actually going to be run.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"057feb97800658c573e1c09cd4f16cf745a6733b","unresolved":false,"context_lines":[{"line_number":86,"context_line":"  that function, passing a TaskManager object and `zap_step` arg to the"},{"line_number":87,"context_line":"  function."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"* Create a new function in the deploy interface: `zap(task)` which will"},{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_a01ac47a","line":89,"updated":"2014-11-13 19:06:39.000000000","message":"Ramakrishnan, I think it will be something like task.driver.deploy.zap(task) in the conductor manager.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":86,"context_line":"  that function, passing a TaskManager object and `zap_step` arg to the"},{"line_number":87,"context_line":"  function."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"* Create a new function in the deploy interface: `zap(task)` which will"},{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_5721fb4b","line":89,"updated":"2014-11-13 11:46:46.000000000","message":"Why does zap() need to be in Deploy interface.  I think it can be moved to the conductor, and zap() may be invoked in conductor/manager.py after doing node tear_down (if zapping is enabled on the conductor node) OR may be via API to change the provision_state to ZAPPED.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":86,"context_line":"  that function, passing a TaskManager object and `zap_step` arg to the"},{"line_number":87,"context_line":"  function."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"* Create a new function in the deploy interface: `zap(task)` which will"},{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_6632b4f3","line":89,"in_reply_to":"5a890539_5721fb4b","updated":"2014-11-13 19:49:43.000000000","message":"I generally agree with you, because I don\u0027t think either deploy driver will need to do anything different than what I\u0027ll implement in the base driver. But! when we do things in the conductor rather than the driver, other driver\u0027s can\u0027t override it. If a driver needs to do some setup or post-zapping config, they couldn\u0027t override it downstream. We ran into this situation with long running agents.\n\nI don\u0027t see any concrete benefit in keeping it in the conductor (other than a simpler driver interface), and most everything else we do around deploys is left to the drivers, so this made the most sense to me.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2d18296617d89f5d552bb550424395c381fede16","unresolved":false,"context_lines":[{"line_number":86,"context_line":"  that function, passing a TaskManager object and `zap_step` arg to the"},{"line_number":87,"context_line":"  function."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"* Create a new function in the deploy interface: `zap(task)` which will"},{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_8f2ea741","line":89,"in_reply_to":"5a890539_9656cecc","updated":"2014-11-14 22:38:48.000000000","message":"I agree, I\u0027m going to make this a bit higher level so we don\u0027t argue about the implementation here, and then argue about it again when I actually implement it :)","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4493c90a6e4da84737c413627aa1dc05619ce47e","unresolved":false,"context_lines":[{"line_number":86,"context_line":"  that function, passing a TaskManager object and `zap_step` arg to the"},{"line_number":87,"context_line":"  function."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"* Create a new function in the deploy interface: `zap(task)` which will"},{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_9656cecc","line":89,"in_reply_to":"5a890539_a01ac47a","updated":"2014-11-14 16:51:08.000000000","message":"Just an outsider\u0027s opinion: Your specs don\u0027t need implementation details. In fact, often implementation details will be vastly different once you dive into the change. This particular section seems entirely too detailed and low level from my naive point of view.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"057feb97800658c573e1c09cd4f16cf745a6733b","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"},{"line_number":93,"context_line":"  currently execute step in driver_info."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_207974c8","line":93,"updated":"2014-11-13 19:06:39.000000000","message":"Can you specify more about the detail on how to keep track of this in driver_info, like the key name for this information?","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"},{"line_number":93,"context_line":"  currently execute step in driver_info."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_864400b8","line":93,"in_reply_to":"5a890539_207974c8","updated":"2014-11-13 19:49:43.000000000","message":"I think we might be getting a bit too implementation heavy for a spec, but let\u0027s say \"zap_step\" is the key in driver_info, it is the step that is about to be or is already started, and it\u0027ll be a combination of the driver and step keys from the zap step dict from above, e.g. \"zap_step\": \"ipmitool:rotate_ipmi_password\", or something to that effect.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"a737b2cf3b689c5a2965b44f237e6ad99da16b9d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"},{"line_number":93,"context_line":"  currently execute step in driver_info."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_838689d9","line":93,"in_reply_to":"5a890539_864400b8","updated":"2014-11-14 19:17:36.000000000","message":"I take the key name in the driver_info as part of the API and thus asking for it. Thanks for your reply.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4493c90a6e4da84737c413627aa1dc05619ce47e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"},{"line_number":93,"context_line":"  currently execute step in driver_info."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_d673f67d","line":93,"in_reply_to":"5a890539_864400b8","updated":"2014-11-14 16:51:08.000000000","message":"Lol and then after writing the comment above I read this comment. Agree with Josh. ;)","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2d18296617d89f5d552bb550424395c381fede16","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  coordinate `get_zap_steps()` and `execute_zap_step()`. It will be implemented"},{"line_number":91,"context_line":"  in the DeployInterface base class to call `get_zap_steps()` and then"},{"line_number":92,"context_line":"  `execute_zap_step()` on each returned step. It will keep track of the"},{"line_number":93,"context_line":"  currently execute step in driver_info."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_cf0d0fea","line":93,"in_reply_to":"5a890539_d673f67d","updated":"2014-11-14 22:38:48.000000000","message":":)","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c9f4a3ea26f380feb6874c1a2e28892e5e5fb715","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"* ZAPPED will be used much like DELETED: generally as a target provision state."},{"line_number":106,"context_line":"  A node will be in ZAPPED state after ZAPPING completes and until the"},{"line_number":107,"context_line":"  conductor gets a chance to move it to AVAILABLe."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"* Make the Nova Virt Driver look for ZAPPING, ZAPPED, and ZAPFAIL states"},{"line_number":110,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_f4e4653d","line":107,"updated":"2014-11-14 22:00:01.000000000","message":"nit s/AVAILABLe/AVAILABLE/","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"057feb97800658c573e1c09cd4f16cf745a6733b","unresolved":false,"context_lines":[{"line_number":122,"context_line":"  operators have the choice to disable the feature if it is unnecessary for"},{"line_number":123,"context_line":"  their deployment."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Diagram of node transitions"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_a0f00468","line":125,"updated":"2014-11-13 19:06:39.000000000","message":"Maybe remove this line if you don\u0027t want to describe the node transitions here,","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"a737b2cf3b689c5a2965b44f237e6ad99da16b9d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"  operators have the choice to disable the feature if it is unnecessary for"},{"line_number":123,"context_line":"  their deployment."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Diagram of node transitions"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_e374adff","line":125,"in_reply_to":"5a890539_66ab9475","updated":"2014-11-14 19:17:36.000000000","message":":)","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"  operators have the choice to disable the feature if it is unnecessary for"},{"line_number":123,"context_line":"  their deployment."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Diagram of node transitions"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_66ab9475","line":125,"in_reply_to":"5a890539_a0f00468","updated":"2014-11-13 19:49:43.000000000","message":"oh no! I don\u0027t know where the diagram went! I must have removed it when I was trying to get the tests to pass and forgot to put it back in.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c9f4a3ea26f380feb6874c1a2e28892e5e5fb715","unresolved":false,"context_lines":[{"line_number":154,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":155,"context_line":"  while the node is in a ZAPPING state. A node in ZAPFAIL"},{"line_number":156,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":157,"context_line":"  to restart the node to fix it."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* The API will allow users to put a node directly into zapping"},{"line_number":160,"context_line":"  provision_state with a POST, the same as how provision state is changed"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_4fda004d","line":157,"updated":"2014-11-14 22:00:01.000000000","message":"what state(s) will operators be able to put a node in from a zap failed state. Ie could an operator go directly to AVAILABLE or would the node have to go through zapping again?","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8923a14746803593e3f7c77b236421d2cd9db7da","unresolved":false,"context_lines":[{"line_number":154,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":155,"context_line":"  while the node is in a ZAPPING state. A node in ZAPFAIL"},{"line_number":156,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":157,"context_line":"  to restart the node to fix it."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* The API will allow users to put a node directly into zapping"},{"line_number":160,"context_line":"  provision_state with a POST, the same as how provision state is changed"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_b2658cb6","line":157,"in_reply_to":"5a890539_4fda004d","updated":"2014-11-15 00:11:51.000000000","message":"I think either AVAILABLE or ZAPPING should be valid.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":156,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":157,"context_line":"  to restart the node to fix it."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* The API will allow users to put a node directly into zapping"},{"line_number":160,"context_line":"  provision_state with a POST, the same as how provision state is changed"},{"line_number":161,"context_line":"  anywhere else in Ironic."},{"line_number":162,"context_line":"  This can be useful for verifying newly added nodes or if"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_7747d71d","line":159,"updated":"2014-11-13 11:46:46.000000000","message":"The API should allow operator to put a node to ZAPPED only when it is in AVAILABLE state.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":157,"context_line":"  to restart the node to fix it."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* The API will allow users to put a node directly into zapping"},{"line_number":160,"context_line":"  provision_state with a POST, the same as how provision state is changed"},{"line_number":161,"context_line":"  anywhere else in Ironic."},{"line_number":162,"context_line":"  This can be useful for verifying newly added nodes or if"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_e655c4fa","line":159,"in_reply_to":"5a890539_7747d71d","updated":"2014-11-13 19:49:43.000000000","message":"Agreed, I meant to put that in here (and I think we laid that out in the state machine spec, but it should be reiterated here).","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":162,"context_line":"  This can be useful for verifying newly added nodes or if"},{"line_number":163,"context_line":"  an operator wants to put a fleet of inactive servers into a known state."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"* An API endpoint should be added to allow operators to see currently"},{"line_number":166,"context_line":"  enabled zap steps and their ordering. This will be a GET endpoint"},{"line_number":167,"context_line":"  at /nodes/\u003cuuid\u003e/deploy/zap_steps and will return the exact"},{"line_number":168,"context_line":"  data noted above for `get_zap_steps()`, as a JSON document and ordered"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_f7be67d3","line":165,"updated":"2014-11-13 11:46:46.000000000","message":"Again, why does zap has to be inside deploy.  It can be independent of deploy and zap is not part of deploy.  Can we put it in /nodes/\u003cuuid\u003e/zap_steps.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":162,"context_line":"  This can be useful for verifying newly added nodes or if"},{"line_number":163,"context_line":"  an operator wants to put a fleet of inactive servers into a known state."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"* An API endpoint should be added to allow operators to see currently"},{"line_number":166,"context_line":"  enabled zap steps and their ordering. This will be a GET endpoint"},{"line_number":167,"context_line":"  at /nodes/\u003cuuid\u003e/deploy/zap_steps and will return the exact"},{"line_number":168,"context_line":"  data noted above for `get_zap_steps()`, as a JSON document and ordered"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_9118bc76","line":165,"in_reply_to":"5a890539_f7be67d3","updated":"2014-11-13 19:49:43.000000000","message":"I think it\u0027s as much a part of deploy as tear_down is part of the deploy. There\u0027s already support to disable it as part of the tear_down cycle (where you\u0027d only trigger zapping via the API, rather than after each tear_down) if an operator doesn\u0027t care to spend the extra time wiping the disks, etc between each deploy.\n\nNova only cares about zap in so far as to removing the instance while the node is being deleted or zapped. Nova already removes the instance while Ironic is busy doing tear_down, so it\u0027s not much of a stretch to say it should do the same thing if it quickly goes through tear_down and starts zapping before Nova has a chance to remove the instance.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"057feb97800658c573e1c09cd4f16cf745a6733b","unresolved":false,"context_lines":[{"line_number":162,"context_line":"  This can be useful for verifying newly added nodes or if"},{"line_number":163,"context_line":"  an operator wants to put a fleet of inactive servers into a known state."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"* An API endpoint should be added to allow operators to see currently"},{"line_number":166,"context_line":"  enabled zap steps and their ordering. This will be a GET endpoint"},{"line_number":167,"context_line":"  at /nodes/\u003cuuid\u003e/deploy/zap_steps and will return the exact"},{"line_number":168,"context_line":"  data noted above for `get_zap_steps()`, as a JSON document and ordered"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_23225e52","line":165,"in_reply_to":"5a890539_f7be67d3","updated":"2014-11-13 19:06:39.000000000","message":"Ramakrishnan, I have the exactly same question before :) I think this is also the reason of the impact to nova API. If we think nova only care for provision, then it should only care for the real provision related states. Because this spec put the zap as part of provision, thus it will impact Nova.\n\nI think the issue possibly comes that the deploy_state in fact becomes the whole task state machine, per https://review.openstack.org/#/c/133828/2/specs/kilo/new-ironic-state-machine.rst discussion.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":171,"context_line":"RPC API impact"},{"line_number":172,"context_line":"--------------"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"At the end of a tear down, the conductor will call() the zap()"},{"line_number":175,"context_line":"method of the deploy driver."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"If the conductor is upgraded first, the zapping will work as expected,"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_97a0c3a0","line":174,"updated":"2014-11-13 11:46:46.000000000","message":"Ditto, should it be part of deploy driver ?","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":180,"context_line":"\"zapped\", the API will return an error that it isn\u0027t supported."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Driver API impact"},{"line_number":184,"context_line":"-----------------"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"* `zap(task)` will be added to the DeployInterface base class"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_77c6f74a","line":183,"updated":"2014-11-13 11:46:46.000000000","message":"May be we can add how to use the decorator method @zap_step here.","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":180,"context_line":"\"zapped\", the API will return an error that it isn\u0027t supported."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Driver API impact"},{"line_number":184,"context_line":"-----------------"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"* `zap(task)` will be added to the DeployInterface base class"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_865de017","line":183,"in_reply_to":"5a890539_77c6f74a","updated":"2014-11-13 19:49:43.000000000","message":"Sure. Taking my comments to Shrews into account, it\u0027ll basically be \"@zap_step(priority\u003dCONF.$driver.zap_priority_$step_name)\" over any zap step.\n\ne.g. rotating IPMI password\n\n@zap_step(priority\u003dCONF.ipmitool.rotate_ipmi_password_zap_priority)\ndef rotate_ipmi_password(self, task):\n    etc etc","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":183,"context_line":"Driver API impact"},{"line_number":184,"context_line":"-----------------"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"* `zap(task)` will be added to the DeployInterface base class"},{"line_number":187,"context_line":"  and implemented there to simply call `execute_zap_steps()` on each"},{"line_number":188,"context_line":"  step. This will be called after tear_down by the conductor."},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_9777e339","line":186,"updated":"2014-11-13 11:46:46.000000000","message":"Ditto, should it be part of DeployInterface ? Can\u0027t it be just in conductor/manager.py itself ?  Conductor can still call it after tear_down().","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":285,"context_line":"---------------------"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"* Deployers will need to inspect which zap steps are being performed and adjust"},{"line_number":288,"context_line":"  wehther each step is performed and at what priority if the defaults don\u0027t"},{"line_number":289,"context_line":"  work for their environment."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_1785b3cf","line":288,"updated":"2014-11-13 11:46:46.000000000","message":"nit: whether","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"56b8c84fa93818e092ac5cbd640609aa373c0fe4","unresolved":false,"context_lines":[{"line_number":308,"context_line":"  jroll"},{"line_number":309,"context_line":"  JayF"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Work Items"},{"line_number":312,"context_line":"----------"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"* Add zap() to the deploy base class and call from the conductor"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_f764a74a","line":311,"updated":"2014-11-13 11:46:46.000000000","message":"Missing decorator method @zap_step()","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"157a0f34ea0fc34c0f81cdc6ffcce1dd3d940e0a","unresolved":false,"context_lines":[{"line_number":308,"context_line":"  jroll"},{"line_number":309,"context_line":"  JayF"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Work Items"},{"line_number":312,"context_line":"----------"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"* Add zap() to the deploy base class and call from the conductor"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5a890539_e6a94491","line":311,"in_reply_to":"5a890539_f764a74a","updated":"2014-11-13 19:49:43.000000000","message":"+1","commit_id":"42ebcd4dc51f80d195d68bdc1b9df73a0795badc"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"57ccfaac95c5346cf0b6e7c7dff96ad93d722593","unresolved":false,"context_lines":[{"line_number":45,"context_line":"* The current PXE ramdisk would support a limited subset of zapping"},{"line_number":46,"context_line":"  steps, such as erase_devices(). Steps such as verifying the node\u0027s properties"},{"line_number":47,"context_line":"  will require cooperation of the BMC, Ironic Python Agent, or additions to"},{"line_number":48,"context_line":"  the current ramdisk."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Proposed change"},{"line_number":51,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_66ac268d","line":48,"updated":"2014-11-17 14:57:30.000000000","message":"+1 I hope that by the time we do it we will have IPA being the default ramdisk for the PXE driver too.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"57ccfaac95c5346cf0b6e7c7dff96ad93d722593","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. If priority is set to 0, the step"},{"line_number":62,"context_line":"  will not be executed. I expect in most cases it will take a config option"},{"line_number":63,"context_line":"  as the arg, e.g. `priority\u003dCONF.$driver.$stepname_priority` to"},{"line_number":64,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"},{"line_number":67,"context_line":"  base implementation will get a list of functions decorated with"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_63b8982a","line":64,"updated":"2014-11-17 14:57:30.000000000","message":"Having a decorator like that makes me think whether it\u0027s too simplistic. I see a \"step\" being extended to support other stuff in the future. For e.g someone may want to add a logic to revert() the step in case it failed; or retry() an X number of times before failing; Maybe even assuming that not all flow needs to be linear, some tasks may want to run in parallel.\n\nI don\u0027t want to overthink or overcomplicate it. But the more I think about it the more I think about TaskFlow. Did you guys look into it? It seems that TaskFlow can do many of this. \n\nWe don\u0027t need to start with everything that is supported by TaskFlow, could be a simple linear flow mimic\u0027ing what you\u0027ve described here. But it also opens a big window in case we want to extend the way things works in the future.\n\nTake a look at it:\n\n http://docs.openstack.org/developer/taskflow/examples.html\n\n http://docs.openstack.org/developer/taskflow/","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0a4eb271b24c171cf8354b4d5de88429df554cf0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. If priority is set to 0, the step"},{"line_number":62,"context_line":"  will not be executed. I expect in most cases it will take a config option"},{"line_number":63,"context_line":"  as the arg, e.g. `priority\u003dCONF.$driver.$stepname_priority` to"},{"line_number":64,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"},{"line_number":67,"context_line":"  base implementation will get a list of functions decorated with"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_4750e80a","line":64,"in_reply_to":"5a890539_3976b306","updated":"2014-11-18 10:47:00.000000000","message":"I see, right I agree. My concern was really being too simplistic but I can see that if needed something more complex it would be simple to migrate to use a library like TaskFlow. So I\u0027m happy with the approach taken here. +1","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a807b836561277cb483c2ae962f4796188d22db1","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. If priority is set to 0, the step"},{"line_number":62,"context_line":"  will not be executed. I expect in most cases it will take a config option"},{"line_number":63,"context_line":"  as the arg, e.g. `priority\u003dCONF.$driver.$stepname_priority` to"},{"line_number":64,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"},{"line_number":67,"context_line":"  base implementation will get a list of functions decorated with"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_e60bb67a","line":64,"in_reply_to":"5a890539_63b8982a","updated":"2014-11-17 14:59:15.000000000","message":"Btw the TaskFlow guys are quite active, if we need some help we can talk to them at #openstack-state-management","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945bbfe21c0f7758f5880ff03824155dd7699dcf","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  first, then a step with priority 10, etc. If priority is set to 0, the step"},{"line_number":62,"context_line":"  will not be executed. I expect in most cases it will take a config option"},{"line_number":63,"context_line":"  as the arg, e.g. `priority\u003dCONF.$driver.$stepname_priority` to"},{"line_number":64,"context_line":"  give the operator more control over the order steps run in (if at all)."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* Add a new function `get_zap_steps()` to the BaseDriver class. The"},{"line_number":67,"context_line":"  base implementation will get a list of functions decorated with"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_3976b306","line":64,"in_reply_to":"5a890539_e60bb67a","updated":"2014-11-17 22:46:12.000000000","message":"I did look into TaskFlow. I think it is a big hammer to hit what will be a relatively tiny amount of zap steps per driver (at least to start).\n\nBut! I think if we do hit a point where the decorator is limiting, it\u0027ll be easy to transition the decorator and priority to a create a TaskFlow task and register it. It\u0027d even be easy to do that in a backwards compatible. E.g. take functions and call them from execute() from a task.Task, and add it to the flow to be executed serially. We\u0027d have to do something similar with generating steps on the fly for IPA (which will generate steps based on hardware managers in the running agent). \n\nThe parallel tasks and retry/revert are interesting and something that\u0027d probably be useful all over Ironic for a more resilient and self-healing service. But I\u0027d like to keep this to a relatively small, simple implementation for the first pass to make sure we can get it done.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"9c3eca53ac50e12a7f70afa472cfab9a622e6d7f","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"  Only steps with a priority greater than 0 (enabled steps) will be returned."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* Add a new function `execute_zap_step(zap_step)` to the BaseDriver, which"},{"line_number":85,"context_line":"  takes one of the dictionaries returned by `get_zap_steps()` as an arg, and"},{"line_number":86,"context_line":"  execute the specified step."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_c7d186fc","line":84,"updated":"2014-11-24 10:14:58.000000000","message":"Are there plans to provide API endpoint for execute_zap_step()","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"08f4410a4217f77e4242d6144bd04147624c1c78","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"  Only steps with a priority greater than 0 (enabled steps) will be returned."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* Add a new function `execute_zap_step(zap_step)` to the BaseDriver, which"},{"line_number":85,"context_line":"  takes one of the dictionaries returned by `get_zap_steps()` as an arg, and"},{"line_number":86,"context_line":"  execute the specified step."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_55e4523b","line":84,"in_reply_to":"5a890539_c7d186fc","updated":"2014-11-24 17:47:33.000000000","message":"I think the execute_zap_step should be an internal API. I could see adding support for an arg when setting the provision_state to zapping, or something to that effect.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"9bb58c49327b441d4f77a34d8b89a100031c7b53","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  steps and excute them by priority. It will be added to the deploy"},{"line_number":91,"context_line":"  interface to allow drivers (particularly downstream) to override how"},{"line_number":92,"context_line":"  the steps are executed without needing to patch other parts of Ironic,"},{"line_number":93,"context_line":"  e.g. the conductor."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_5e309307","line":93,"updated":"2014-11-19 02:04:50.000000000","message":"Just want to make sure that this spec allows some zap steps to be performed out-of-band.  For instance, firmware settings and firmware update can be done out-of-band.   I would like to understand how IPA coordiantes with BMC to do the mix of in-band and OOB zap steps so that the same step will only be performed once either via OOB BMC or IPA. For instance, agent-ilo driver may do some steps OOB and passes the remaining steps to IPA.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"57ccfaac95c5346cf0b6e7c7dff96ad93d722593","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  steps and excute them by priority. It will be added to the deploy"},{"line_number":91,"context_line":"  interface to allow drivers (particularly downstream) to override how"},{"line_number":92,"context_line":"  the steps are executed without needing to patch other parts of Ironic,"},{"line_number":93,"context_line":"  e.g. the conductor."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_e6a49609","line":93,"updated":"2014-11-17 14:57:30.000000000","message":"The only problem with that I see is that each driver can overwrite it and run the tasks the way they want, it\u0027s similar of what we had with the vendor_passthru functions, where drivers would implement their own vendor_passthru() or driver_vendor_passthru() to run their custom methods.\n\nI understand the need of patching the conductor may be a bit complicated, but I believe that having only one way (or engine) to run the tasks that would live outside the drivers world may be beneficial, it\u0027s simpler to understand, it avoids code duplication, it guarantees that errors are going to be handled correctly and logged correcly and all the other stuff like putting the node in maintenance if an error occurs etc... Can be done in a single place.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0a4eb271b24c171cf8354b4d5de88429df554cf0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  steps and excute them by priority. It will be added to the deploy"},{"line_number":91,"context_line":"  interface to allow drivers (particularly downstream) to override how"},{"line_number":92,"context_line":"  the steps are executed without needing to patch other parts of Ironic,"},{"line_number":93,"context_line":"  e.g. the conductor."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_a7b6ecf6","line":93,"in_reply_to":"5a890539_1c948589","updated":"2014-11-18 10:47:00.000000000","message":"Oh right. I still think it\u0027s doable/better to do it in one place, the restart example looks pretty good and generic, other drivers may want to have that as well. I like the idea of improving something for one will also improve for others.\n\nAlso, I believe that having framework to run it makes things more consistent. Again on the vendor_passthru example, the drivers upstream were pretty inconsistent, some logging errors some not, different exceptions being raised by the same error etc... Imagine what the drivers downstream might be doing. \n\nSo I\u0027m +1 for the RestartZapException.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"699be0367b8d1a01c0437d223d30dfb937187565","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  steps and excute them by priority. It will be added to the deploy"},{"line_number":91,"context_line":"  interface to allow drivers (particularly downstream) to override how"},{"line_number":92,"context_line":"  the steps are executed without needing to patch other parts of Ironic,"},{"line_number":93,"context_line":"  e.g. the conductor."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_5f179151","line":93,"in_reply_to":"5a890539_5e309307","updated":"2014-11-19 19:09:56.000000000","message":"Yup, if the iLO management interface registers steps with priorities: A(10), B(30), and IPA registers step C(20), they\u0027d be executed: A, C, B (priority order). I don\u0027t expect much overlap between what in band and out of band can do. For example, if both can update firmware, they\u0027re probably updating different firmwares. My IPMI doesn\u0027t support in band updating, and I don\u0027t think you can update my Seagate PCIe Flash drives from iLO (definitely not from IPMI). \n\nIf there is some overlap that we need to only perform once, there are config options to disable steps. So if you only want iLO firmware update, you\u0027d set agent.firmware_update_priority to 0 (disabled).","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"94cb712376db3589f454e8ac0b6e7e66badad83e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  steps and excute them by priority. It will be added to the deploy"},{"line_number":91,"context_line":"  interface to allow drivers (particularly downstream) to override how"},{"line_number":92,"context_line":"  the steps are executed without needing to patch other parts of Ironic,"},{"line_number":93,"context_line":"  e.g. the conductor."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_ccc5c23e","line":93,"in_reply_to":"5a890539_a7b6ecf6","updated":"2014-11-18 21:34:54.000000000","message":"That works for me, as long as no one has objections.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"945bbfe21c0f7758f5880ff03824155dd7699dcf","unresolved":false,"context_lines":[{"line_number":90,"context_line":"  steps and excute them by priority. It will be added to the deploy"},{"line_number":91,"context_line":"  interface to allow drivers (particularly downstream) to override how"},{"line_number":92,"context_line":"  the steps are executed without needing to patch other parts of Ironic,"},{"line_number":93,"context_line":"  e.g. the conductor."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* In the event of a tie for priority,"},{"line_number":96,"context_line":"  the tie breaker will be the driver implementing the function, in the order"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_1c948589","line":93,"in_reply_to":"5a890539_e6a49609","updated":"2014-11-17 22:46:12.000000000","message":"I\u0027d lean towards more control for the drivers, but I agree with your points..it\u0027ll get messy if we leave it to drivers.\n\nThe only counter argument I have is: the agent uses versioned hardware managers, which Ironic checks before running each step. If the step changes, decom is restarted from the first step. This makes upgrading the agent and Ironic separately possible and massively reduces headaches with designing each version to being backwards compatible, which is nearly impossible with things like BIOS versions + BIOS settings/\n\nTo implement that, we could either add a special Exception like RestartDecomException, which the conductor looks specifically for, or letting the agent decom look slightly different. I\u0027m ok with either implementation.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"9c3eca53ac50e12a7f70afa472cfab9a622e6d7f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":99,"context_line":"  then the deploy driver\u0027s step."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* Using ZAPPING, ZAPPED, and ZAPFAIL that will be added in the"},{"line_number":102,"context_line":"  new state machine spec [1]. These states occur between DELETED and AVAILABLE."},{"line_number":103,"context_line":"  This will prevent Nova delete commands from taking hours."},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_27488ab2","line":101,"updated":"2014-11-24 10:14:58.000000000","message":"And also , I think capturing which zap_step is currently being performed in zapping process is also useful. I couldn\u0027t see it updated anywhere in the spec.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"08f4410a4217f77e4242d6144bd04147624c1c78","unresolved":false,"context_lines":[{"line_number":98,"context_line":"  implement a step with priority 10, power\u0027s step will be executed first,"},{"line_number":99,"context_line":"  then the deploy driver\u0027s step."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* Using ZAPPING, ZAPPED, and ZAPFAIL that will be added in the"},{"line_number":102,"context_line":"  new state machine spec [1]. These states occur between DELETED and AVAILABLE."},{"line_number":103,"context_line":"  This will prevent Nova delete commands from taking hours."},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_35498631","line":101,"in_reply_to":"5a890539_27488ab2","updated":"2014-11-24 17:47:33.000000000","message":"This was detailed before as part of driver_info, but we agreed we were getting too implementation specific. I think a new DB field should be used (either a new one or if there\u0027s a task_state field added in the new state machine) since the conductor is going to be deciding the order and calling execute_zap_step().","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"2ef962277dacb8255250401bfeaedb75c18eb1e3","unresolved":false,"context_lines":[{"line_number":120,"context_line":"  have last_error set appropriately, and be put into maintenance."},{"line_number":121,"context_line":"  The node will not be powered off,"},{"line_number":122,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":123,"context_line":"  and put the node\u0027s provision_state back to ZAPPED to retry"},{"line_number":124,"context_line":"  zapping or skip to AVAILABLE."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"* ZAPPING will not be performed on rebuilds."}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_d5245e10","line":123,"updated":"2014-11-19 05:55:56.000000000","message":"Is it not ZAPPING state to retry? ZAPPED is more of target_provision_state right?","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"699be0367b8d1a01c0437d223d30dfb937187565","unresolved":false,"context_lines":[{"line_number":120,"context_line":"  have last_error set appropriately, and be put into maintenance."},{"line_number":121,"context_line":"  The node will not be powered off,"},{"line_number":122,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":123,"context_line":"  and put the node\u0027s provision_state back to ZAPPED to retry"},{"line_number":124,"context_line":"  zapping or skip to AVAILABLE."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"* ZAPPING will not be performed on rebuilds."}],"source_content_type":"text/x-rst","patch_set":15,"id":"5a890539_df02a10a","line":123,"in_reply_to":"5a890539_d5245e10","updated":"2014-11-19 19:09:56.000000000","message":"Ahh yes that\u0027s what I meant, thanks. The POST call would be to ZAPPED, the internal state would be provision_state\u003dZAPPING, target_provision_state\u003dZAPPED.","commit_id":"abb8bd1a12a5e91f09372404764eca4104c7ef95"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"a4ad7af9fd31523c2f9fc4acb71ed5cc89dfbf10","unresolved":false,"context_lines":[{"line_number":25,"context_line":"  users."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"* These steps can also be performed (if enabled) on newly enrolled nodes moving"},{"line_number":28,"context_line":"  from INIT to AVAILABLE."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"* These baseline tasks should be any long running task that a) ensures nodes"},{"line_number":31,"context_line":"  are consistent from a user\u0027s point of view and b) take long enough that"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_ad04d615","line":28,"updated":"2014-12-08 21:23:16.000000000","message":"nit: enroll","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"7facd1b98a90555ff7fd61a13186c4f93766c821","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  using custom hardware managers in the Ironic Python Agent or with out of"},{"line_number":43,"context_line":"  band systems that support it."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"* The current PXE ramdisk would support a limited subset of zapping"},{"line_number":46,"context_line":"  steps, such as erase_devices(). Steps such as verifying the node\u0027s properties"},{"line_number":47,"context_line":"  will require cooperation of the BMC, Ironic Python Agent, or additions to"},{"line_number":48,"context_line":"  the current ramdisk."}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_0945336e","line":45,"updated":"2014-12-04 07:02:37.000000000","message":"What about IPA ramdisk?  Are you proposing IPA and PXE to use the same ramdisk?  I would love to see that so that we don\u0027t need to repeat same zapping scripts in two seperate ramdisks.\r\n\r\nAlso, will IPA provide interface for vendors to plug-in their zapping functions, e.g., RAID configuration interface,..etc.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  using custom hardware managers in the Ironic Python Agent or with out of"},{"line_number":43,"context_line":"  band systems that support it."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"* The current PXE ramdisk would support a limited subset of zapping"},{"line_number":46,"context_line":"  steps, such as erase_devices(). Steps such as verifying the node\u0027s properties"},{"line_number":47,"context_line":"  will require cooperation of the BMC, Ironic Python Agent, or additions to"},{"line_number":48,"context_line":"  the current ramdisk."}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_2426f1ce","line":45,"in_reply_to":"5a890539_0945336e","updated":"2014-12-12 19:02:51.000000000","message":"IPA supports custom hardware managers (which will have cleaning steps) for managing RAID, custom hardware, etc, and a standard set of cleaning tasks that the stock ramdisk will support. \n\nI agree I\u0027d like to avoid seeing too much overlap, and hopefully we\u0027ll merge the PXE and IPA ramdisks very soon.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"a4ad7af9fd31523c2f9fc4acb71ed5cc89dfbf10","unresolved":false,"context_lines":[{"line_number":108,"context_line":"* Nodes maybe be put into ZAPPING via an API call (described below) only"},{"line_number":109,"context_line":"  from INIT and AVAILABLE states. INIT allows an operator to zap a node before"},{"line_number":110,"context_line":"  it is available for scheduling. This ensures new nodes are at the same"},{"line_number":111,"context_line":"  baseline as other, already added nodes."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* In the future, the API call to put a node in ZAPPING should allow an"},{"line_number":114,"context_line":"  argument that specifies a step, so a single zap step can be executed"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_cbe2ead4","line":111,"updated":"2014-12-08 21:23:16.000000000","message":"Nit: enroll","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"7facd1b98a90555ff7fd61a13186c4f93766c821","unresolved":false,"context_lines":[{"line_number":113,"context_line":"* In the future, the API call to put a node in ZAPPING should allow an"},{"line_number":114,"context_line":"  argument that specifies a step, so a single zap step can be executed"},{"line_number":115,"context_line":"  when a node is in a INIT or AVAILABLE state."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"* Make the Nova Virt Driver look for ZAPPING, ZAPPED, and ZAPFAIL states"},{"line_number":118,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"},{"line_number":119,"context_line":"  of active nodes more quickly. Failures to zap should not be"}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_6f3b1238","line":116,"updated":"2014-12-04 07:02:37.000000000","message":"Why not allow it now?","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":113,"context_line":"* In the future, the API call to put a node in ZAPPING should allow an"},{"line_number":114,"context_line":"  argument that specifies a step, so a single zap step can be executed"},{"line_number":115,"context_line":"  when a node is in a INIT or AVAILABLE state."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"* Make the Nova Virt Driver look for ZAPPING, ZAPPED, and ZAPFAIL states"},{"line_number":118,"context_line":"  in _wait_for_provision_state() so the node can be removed from a users list"},{"line_number":119,"context_line":"  of active nodes more quickly. Failures to zap should not be"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_9700b502","line":116,"in_reply_to":"5a890539_6f3b1238","updated":"2014-12-12 19:02:51.000000000","message":"Just making sure we can actually land this before Kilo ends. If I can add it, I will.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"f4af942a6f986e568dfac8fdfac5f70b6251d8bc","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* If a zap fails, the node will be put into ZAPFAIL state,"},{"line_number":123,"context_line":"  have last_error set appropriately, and be put into maintenance."},{"line_number":124,"context_line":"  The node will not be powered off,"},{"line_number":125,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":126,"context_line":"  and put the node\u0027s target_provision_state back to ZAPPED via the API to retry"},{"line_number":127,"context_line":"  zapping or skip to AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_e3b2fb47","line":124,"updated":"2014-12-03 03:32:37.000000000","message":"does it make sense to have timeout for zapping tasks, so that it would return to zapfail if it is stuck or hang in anycase?","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"7facd1b98a90555ff7fd61a13186c4f93766c821","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* If a zap fails, the node will be put into ZAPFAIL state,"},{"line_number":123,"context_line":"  have last_error set appropriately, and be put into maintenance."},{"line_number":124,"context_line":"  The node will not be powered off,"},{"line_number":125,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":126,"context_line":"  and put the node\u0027s target_provision_state back to ZAPPED via the API to retry"},{"line_number":127,"context_line":"  zapping or skip to AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_4f03b641","line":124,"in_reply_to":"5a890539_4c16804a","updated":"2014-12-04 07:02:37.000000000","message":"Configuable timeouts could be useful.    Every zap step should have  its own configurable timeout since some steps will take longer than others. If an operator chose not to timeout a specific step, he/she should have that option as weel, e.g. timeout 0 means no timeout.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* If a zap fails, the node will be put into ZAPFAIL state,"},{"line_number":123,"context_line":"  have last_error set appropriately, and be put into maintenance."},{"line_number":124,"context_line":"  The node will not be powered off,"},{"line_number":125,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":126,"context_line":"  and put the node\u0027s target_provision_state back to ZAPPED via the API to retry"},{"line_number":127,"context_line":"  zapping or skip to AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_574c8d70","line":124,"in_reply_to":"5a890539_4f03b641","updated":"2014-12-12 19:02:51.000000000","message":"I think this will be very challenging, and better for a second pass. For example, what do you set for erase disks? Secure erase on awesome new drives is basically instant, secure erase on 48 spinning drives could be....quite a long time.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8ef7c43549ef77f92b2c4289e65564d28896010a","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* If a zap fails, the node will be put into ZAPFAIL state,"},{"line_number":123,"context_line":"  have last_error set appropriately, and be put into maintenance."},{"line_number":124,"context_line":"  The node will not be powered off,"},{"line_number":125,"context_line":"  as a power cycle could damage a node. The operator can then fix the node,"},{"line_number":126,"context_line":"  and put the node\u0027s target_provision_state back to ZAPPED via the API to retry"},{"line_number":127,"context_line":"  zapping or skip to AVAILABLE."}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_4c16804a","line":124,"in_reply_to":"5a890539_e3b2fb47","updated":"2014-12-03 17:39:54.000000000","message":"I think it\u0027s possible but A) it\u0027s incredibly hard to come up with a decent number and 100% needs to be config options set by operators and B) let\u0027s not do it for the first pass. For example, a server doing a very secure wipe of a JBOD with 48 6TB spinning disks? It\u0027s going to take a *long* time.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"a4ad7af9fd31523c2f9fc4acb71ed5cc89dfbf10","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"::"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"  Simplified diagram of node transitions"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                               +----------------+"},{"line_number":136,"context_line":"                               |     ZAPFAIL    |"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_ebfec66a","line":133,"updated":"2014-12-08 21:23:16.000000000","message":"may want to remove this and just reference the new state machine spec.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"::"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"  Simplified diagram of node transitions"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                               +----------------+"},{"line_number":136,"context_line":"                               |     ZAPFAIL    |"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_b7785190","line":133,"in_reply_to":"3a961159_ebfec66a","updated":"2014-12-12 19:02:51.000000000","message":"Woo! Especially now that it\u0027s landed.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"7facd1b98a90555ff7fd61a13186c4f93766c821","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* The drivers could implement this in tear_down only. It would be slower"},{"line_number":155,"context_line":"  from a user perspective."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"* Most of these actions could be taken during deploy. This would"},{"line_number":158,"context_line":"  significantly lengthen the amount of time to deploy in some cases"},{"line_number":159,"context_line":"  (especially with spinning disks)"}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_a55a7b1b","line":156,"updated":"2014-12-04 07:02:37.000000000","message":"So is zapping part of the tear_down or outside tear_down?  I thought it could be part of the tear_down but just  want to makse sure I understand it correctly.  I understand that it can also be triggered by other APIs when the node is in INIT or AVAILABLE state.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* The drivers could implement this in tear_down only. It would be slower"},{"line_number":155,"context_line":"  from a user perspective."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"* Most of these actions could be taken during deploy. This would"},{"line_number":158,"context_line":"  significantly lengthen the amount of time to deploy in some cases"},{"line_number":159,"context_line":"  (especially with spinning disks)"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_17976591","line":156,"in_reply_to":"5a890539_a55a7b1b","updated":"2014-12-12 19:02:51.000000000","message":"Outside of tear_down. It is a separate step that the conductor takes when deleting a node. If it is part of tear down, the node is still in DELETING the whole time, and the Nova driver won\u0027t remove it from a user\u0027s list. Now they could have their node in DELETING for hours (if you bump the timeout for successful deletion wayyyy up).","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"f4af942a6f986e568dfac8fdfac5f70b6251d8bc","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"If a general task state field isn\u0027t added in the state machine spec,"},{"line_number":169,"context_line":"a either a generic task state field or specific zapstep field needs to be"},{"line_number":170,"context_line":"added."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"REST API impact"},{"line_number":173,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_237a4388","line":170,"updated":"2014-12-03 03:32:37.000000000","message":"how about adding a new field like zap_info to the node table, so that any vendor specific drivers would be able to pass some arguments, if they want to perform any out-of-band operations during zapping?\n\ndriver_info also can also be one option, but if its common for all vendors, adding  a new field would be more cleaner approach?","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8ef7c43549ef77f92b2c4289e65564d28896010a","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"If a general task state field isn\u0027t added in the state machine spec,"},{"line_number":169,"context_line":"a either a generic task state field or specific zapstep field needs to be"},{"line_number":170,"context_line":"added."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"REST API impact"},{"line_number":173,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_71187984","line":170,"in_reply_to":"5a890539_237a4388","updated":"2014-12-03 17:39:54.000000000","message":"These are steps taken by drivers, let\u0027s keep any data beyond some task field in driver_info. There shouldn\u0027t be any namespace collisions there. I don\u0027t see any benefit to having a new field.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"3aa36ead5a01bd13899484a24ee5ebc699c334d1","unresolved":false,"context_lines":[{"line_number":172,"context_line":"REST API impact"},{"line_number":173,"context_line":"---------------"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":176,"context_line":"  while the node is in a ZAPPING state. A node in ZAPFAIL"},{"line_number":177,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":178,"context_line":"  to restart the node to fix it."}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_5d705e40","line":175,"updated":"2014-12-01 04:59:27.000000000","message":"Would it be useful to cancel a specific zapping step or zapping operation altogether through an API. This could be useful if the certain zap step gets into hang state or gets into infinite loop kind of thing.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"abbf70ad3e54085559e9c4701f745dc08b4da29d","unresolved":false,"context_lines":[{"line_number":172,"context_line":"REST API impact"},{"line_number":173,"context_line":"---------------"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"* The API will be changed to prevent changing power state or provision state"},{"line_number":176,"context_line":"  while the node is in a ZAPPING state. A node in ZAPFAIL"},{"line_number":177,"context_line":"  state may be powered off via the API, because the operator will likely need"},{"line_number":178,"context_line":"  to restart the node to fix it."}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_dd144e4f","line":175,"in_reply_to":"5a890539_5d705e40","updated":"2014-12-01 05:25:06.000000000","message":"I think that\u0027s something that needs to be addressed through the entire Ironic API, not just here. Something like Nova\u0027s reset-task-state.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"7facd1b98a90555ff7fd61a13186c4f93766c821","unresolved":false,"context_lines":[{"line_number":192,"context_line":"  enabled zap steps and their ordering. This will be a GET endpoint"},{"line_number":193,"context_line":"  at /nodes/\u003cuuid\u003e/zapping/zap_steps and will return the exact"},{"line_number":194,"context_line":"  data noted above for `get_zap_steps()`, as a JSON document and ordered"},{"line_number":195,"context_line":"  by priority."},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"RPC API impact"},{"line_number":198,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_62916951","line":195,"updated":"2014-12-04 07:02:37.000000000","message":"I wonder if an API to allow users to abort a zapping task will be useful.  Zapping may take longer than expected and  a user may want to abort it (?)  It could be hard to implement for some zapping steps though.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":192,"context_line":"  enabled zap steps and their ordering. This will be a GET endpoint"},{"line_number":193,"context_line":"  at /nodes/\u003cuuid\u003e/zapping/zap_steps and will return the exact"},{"line_number":194,"context_line":"  data noted above for `get_zap_steps()`, as a JSON document and ordered"},{"line_number":195,"context_line":"  by priority."},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"RPC API impact"},{"line_number":198,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_37c0e17b","line":195,"in_reply_to":"5a890539_62916951","updated":"2014-12-12 19:02:51.000000000","message":"I think this is something Ironic would find useful in general, not just in zapping.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":11278,"name":"Anusha Ramineni","email":"anusha.ramineni@india.nec.com","username":"anusha08"},"change_message_id":"f4af942a6f986e568dfac8fdfac5f70b6251d8bc","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* The BaseDriver will have a `get_zap_steps()` and"},{"line_number":214,"context_line":"  `execute_zap_steps()` functions added and implemented."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"  def get_zap_steps(task):"},{"line_number":217,"context_line":"    \"\"\"Return the zap steps this driver can perform on a node\"\"\""}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_039c67bf","line":214,"updated":"2014-12-03 03:32:37.000000000","message":"Just a thought, have you not considered making zapping as separate interface?","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"8ef7c43549ef77f92b2c4289e65564d28896010a","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* The BaseDriver will have a `get_zap_steps()` and"},{"line_number":214,"context_line":"  `execute_zap_steps()` functions added and implemented."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"  def get_zap_steps(task):"},{"line_number":217,"context_line":"    \"\"\"Return the zap steps this driver can perform on a node\"\"\""}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_e712e756","line":214,"in_reply_to":"5a890539_039c67bf","updated":"2014-12-03 17:39:54.000000000","message":"Yes, and I think it\u0027s a bad idea. Say you have iLO running the agent. Now you need an interface that has support for all iLO zap steps AND the agent. And on that supports DRAC and the agent. It would get very ugly, very quickly.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"7facd1b98a90555ff7fd61a13186c4f93766c821","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    :param task: a task from TaskManager."},{"line_number":226,"context_line":"    :param step: a step from get_zap_steps()"},{"line_number":227,"context_line":"    :raises ZapExecuteException: if the step fails"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":230,"context_line":"  expected to test their implementation thoroughly."},{"line_number":231,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a890539_e562c3ab","line":228,"updated":"2014-12-04 07:02:37.000000000","message":"Should we also define ManagementInterface for tasks performed by zapping, e.g., firmware setting, firmware update, BMC credential reset, ...etc?  So that drivers can use the same ManagementInterface.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    :param task: a task from TaskManager."},{"line_number":226,"context_line":"    :param step: a step from get_zap_steps()"},{"line_number":227,"context_line":"    :raises ZapExecuteException: if the step fails"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"* Testing will be similar to other driver interfaces and each driver will be"},{"line_number":230,"context_line":"  expected to test their implementation thoroughly."},{"line_number":231,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_d7b79d84","line":228,"in_reply_to":"5a890539_e562c3ab","updated":"2014-12-12 19:02:51.000000000","message":"This is the base driver, so these will be in the ManagementInterface as well.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"a4ad7af9fd31523c2f9fc4acb71ed5cc89dfbf10","unresolved":false,"context_lines":[{"line_number":332,"context_line":"* Add API checks for zap states and allow \"ZAPPED\" as a"},{"line_number":333,"context_line":"  provision target state"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"* Add Nova driver support (may require a separate spec in Nova)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"Dependencies"},{"line_number":338,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_6b4e56c3","line":335,"updated":"2014-12-08 21:23:16.000000000","message":"we should do the leg work here to see is a Nova spec will be required","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"206cb8a0ed528f74d997ffd803ddd68f3205dba7","unresolved":false,"context_lines":[{"line_number":332,"context_line":"* Add API checks for zap states and allow \"ZAPPED\" as a"},{"line_number":333,"context_line":"  provision target state"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"* Add Nova driver support (may require a separate spec in Nova)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"Dependencies"},{"line_number":338,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a961159_177845c3","line":335,"in_reply_to":"3a961159_6b4e56c3","updated":"2014-12-12 19:02:51.000000000","message":"As far as I can tell, it shouldn\u0027t be an issue, as it stays in the driver and doesn\u0027t touch the rest of Nova.","commit_id":"b988f14ddaea64efeda849c6b4b5e037af942a9c"}]}
