)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"6f5a1ddd109d614e666fe12412dce5492d752488","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add /nodes/\u003cuuid\u003e/cleaning/steps API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds a way to list all cleaning steps enabled for a node. Also provides"},{"line_number":10,"context_line":"an \u0027enabled\u0027 paramater for RPC call to enable zapping steps."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint implement-cleaning-states"},{"line_number":13,"context_line":"Change-Id: I0f773f0897ef7d99ca1ccb27c6d839235fa2c393"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ba7be1f8_4ad6e1c6","line":10,"updated":"2015-02-27 17:52:53.000000000","message":"Nit: s/paramater/parameter/","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"0ba518b796dbeb74d6989e5f48962d9c25ca861a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds a way to list all cleaning steps enabled for a node. Also provides"},{"line_number":10,"context_line":"an \u0027enabled\u0027 paramater for RPC call to enable zapping steps."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint implement-cleaning-states"},{"line_number":13,"context_line":"Change-Id: I0f773f0897ef7d99ca1ccb27c6d839235fa2c393"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a80dd14_68a456a6","line":11,"updated":"2015-03-05 23:02:48.000000000","message":"I would like to see a note about api version bump here.","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"1c97de74466cc95edd340dcdadad082a7eddfffa","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        self._set_maintenance(node_ident, False)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":""},{"line_number":777,"context_line":"class NodeCleaningController(rest.RestController):"},{"line_number":778,"context_line":"    _custom_actions \u003d {"},{"line_number":779,"context_line":"        \u0027steps\u0027: [\u0027GET\u0027],"},{"line_number":780,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_6a63931a","line":777,"updated":"2015-02-28 05:00:12.000000000","message":"May be this is a spec thing, but there is nothing in this API call with particular to the node, it should have actually belonged to driver.  \n\nThe below seems much better suited:\n  v1/drivers/foo/cleaning \n\nAs per the comment in the parent patch, it seems this should return the pending clean steps and executed clean steps.","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"35a6cb9f94d7828192fd944ae35b65a217fb6ef6","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        self._set_maintenance(node_ident, False)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":""},{"line_number":777,"context_line":"class NodeCleaningController(rest.RestController):"},{"line_number":778,"context_line":"    _custom_actions \u003d {"},{"line_number":779,"context_line":"        \u0027steps\u0027: [\u0027GET\u0027],"},{"line_number":780,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_57011305","line":777,"in_reply_to":"ba7be1f8_2a819b8f","updated":"2015-02-28 07:54:49.000000000","message":"Oh, sorry, I forgot about your comment on previous patch set that any interface can implement their own get_clean_steps() and make it dynamic. If that\u0027s the case, sorry, please ignore this comment.","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"440a2bf2591851751b2b574d2b927a28c490e6b7","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        self._set_maintenance(node_ident, False)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":""},{"line_number":777,"context_line":"class NodeCleaningController(rest.RestController):"},{"line_number":778,"context_line":"    _custom_actions \u003d {"},{"line_number":779,"context_line":"        \u0027steps\u0027: [\u0027GET\u0027],"},{"line_number":780,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_2a819b8f","line":777,"in_reply_to":"ba7be1f8_6a63931a","updated":"2015-02-28 05:02:13.000000000","message":"Sorry for the confusing last sentence in the above comment.  \n\nI meant as per the comment in the parent patch\n\n  v1/nodes/my-node/cleaning \n\nshould return the pending clean steps for the node and executed clean steps.","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"1c97de74466cc95edd340dcdadad082a7eddfffa","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        \u0027steps\u0027: [\u0027GET\u0027],"},{"line_number":780,"context_line":"    }"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    @wsme_pecan.wsexpose(wtypes.text, types.uuid_or_name)"},{"line_number":783,"context_line":"    def steps(self, node\u003dNone):"},{"line_number":784,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":785,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_e1f7d7f3","line":782,"updated":"2015-02-28 05:00:12.000000000","message":"May be types.jsontype as return value ?","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"1c97de74466cc95edd340dcdadad082a7eddfffa","unresolved":false,"context_lines":[{"line_number":780,"context_line":"    }"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    @wsme_pecan.wsexpose(wtypes.text, types.uuid_or_name)"},{"line_number":783,"context_line":"    def steps(self, node\u003dNone):"},{"line_number":784,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":785,"context_line":""},{"line_number":786,"context_line":"        :param node: UUID or name of a node."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_aa9f4b02","line":783,"updated":"2015-02-28 05:00:12.000000000","message":"Why default value of None ?","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"1c97de74466cc95edd340dcdadad082a7eddfffa","unresolved":false,"context_lines":[{"line_number":783,"context_line":"    def steps(self, node\u003dNone):"},{"line_number":784,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":785,"context_line":""},{"line_number":786,"context_line":"        :param node: UUID or name of a node."},{"line_number":787,"context_line":"        \"\"\""},{"line_number":788,"context_line":"        if not allow_get_clean_steps():"},{"line_number":789,"context_line":"            raise exception.NotAcceptable()"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_ea8863c8","line":786,"updated":"2015-02-28 05:00:12.000000000","message":"missing returns","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"6f5a1ddd109d614e666fe12412dce5492d752488","unresolved":false,"context_lines":[{"line_number":786,"context_line":"        :param node: UUID or name of a node."},{"line_number":787,"context_line":"        \"\"\""},{"line_number":788,"context_line":"        if not allow_get_clean_steps():"},{"line_number":789,"context_line":"            raise exception.NotAcceptable()"},{"line_number":790,"context_line":"        rpc_node \u003d _get_rpc_node(node)"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_4aa42157","line":789,"updated":"2015-02-27 17:52:53.000000000","message":"Not sure what the right thing to do is, but my instinct would be to 404 here (as the endpoint doesn\u0027t \"exist\" in earlier versions).","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"659952d82ffe0925fb3e36c9f09d5c198c1b42c0","unresolved":false,"context_lines":[{"line_number":794,"context_line":"        \u0027steps\u0027: [\u0027GET\u0027],"},{"line_number":795,"context_line":"    }"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"    @wsme_pecan.wsexpose(wtypes.text, types.uuid_or_name)"},{"line_number":798,"context_line":"    def steps(self, node):"},{"line_number":799,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_afaaaf6e","line":797,"updated":"2015-03-13 02:18:13.000000000","message":"nit: better to have types.jsontype (even though it\u0027s what we are returning)","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c3361f7a68057fd1b692732512a9d1e4a37a0059","unresolved":false,"context_lines":[{"line_number":794,"context_line":"        \u0027steps\u0027: [\u0027GET\u0027],"},{"line_number":795,"context_line":"    }"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"    @wsme_pecan.wsexpose(wtypes.text, types.uuid_or_name)"},{"line_number":798,"context_line":"    def steps(self, node):"},{"line_number":799,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_9e7ef7ad","line":797,"in_reply_to":"9a80dd14_afaaaf6e","updated":"2015-03-13 21:42:18.000000000","message":"Done","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0947b57fc9640a3f8505af45c26187559c272fcd","unresolved":false,"context_lines":[{"line_number":799,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"        :param node: UUID or name of a node."},{"line_number":802,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on"},{"line_number":803,"context_line":"        :returns: A list of clean steps enabled for the node"},{"line_number":804,"context_line":"        \"\"\""},{"line_number":805,"context_line":"        if not allow_get_clean_steps():"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_870f8238","line":802,"updated":"2015-03-13 12:06:17.000000000","message":"And exception l806.","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fff053997d9709952ffe2c6e90c586bde2831b2f","unresolved":false,"context_lines":[{"line_number":799,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"        :param node: UUID or name of a node."},{"line_number":802,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on"},{"line_number":803,"context_line":"        :returns: A list of clean steps enabled for the node"},{"line_number":804,"context_line":"        \"\"\""},{"line_number":805,"context_line":"        if not allow_get_clean_steps():"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_a2c29831","line":802,"in_reply_to":"9a80dd14_870f8238","updated":"2015-03-13 21:41:55.000000000","message":"Done","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0947b57fc9640a3f8505af45c26187559c272fcd","unresolved":false,"context_lines":[{"line_number":803,"context_line":"        :returns: A list of clean steps enabled for the node"},{"line_number":804,"context_line":"        \"\"\""},{"line_number":805,"context_line":"        if not allow_get_clean_steps():"},{"line_number":806,"context_line":"            raise exception.NotFound()"},{"line_number":807,"context_line":"        rpc_node \u003d _get_rpc_node(node)"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_c7025a3d","line":806,"updated":"2015-03-13 12:06:17.000000000","message":"AFAIK should be 406 NotAcceptable.","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fff053997d9709952ffe2c6e90c586bde2831b2f","unresolved":false,"context_lines":[{"line_number":803,"context_line":"        :returns: A list of clean steps enabled for the node"},{"line_number":804,"context_line":"        \"\"\""},{"line_number":805,"context_line":"        if not allow_get_clean_steps():"},{"line_number":806,"context_line":"            raise exception.NotFound()"},{"line_number":807,"context_line":"        rpc_node \u003d _get_rpc_node(node)"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_c2d4ecea","line":806,"in_reply_to":"9a80dd14_c7025a3d","updated":"2015-03-13 21:41:55.000000000","message":"I think 404 makes more sense for a new API endpoint, but we debated it in channel, and it looks like 406 makes more sense.","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"4f7b96cf07e47a5d80042973efa99aeaaeb1b9fb","unresolved":false,"context_lines":[{"line_number":813,"context_line":""},{"line_number":814,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":815,"context_line":"        return pecan.request.rpcapi.get_clean_steps("},{"line_number":816,"context_line":"                pecan.request.context, rpc_node.uuid, topic, enabled\u003dTrue)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"class NodesController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_6ecc076b","line":816,"updated":"2015-03-13 23:07:12.000000000","message":"nit: indentation","commit_id":"953cd5440352c8f1be5aa244399fb93420ec1c31"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"46ea660ab705d837f706741b728e7499076c24a5","unresolved":false,"context_lines":[{"line_number":813,"context_line":""},{"line_number":814,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":815,"context_line":"        return pecan.request.rpcapi.get_clean_steps("},{"line_number":816,"context_line":"                pecan.request.context, rpc_node.uuid, topic, enabled\u003dTrue)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"class NodesController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_30778ea1","line":816,"in_reply_to":"9a80dd14_6ecc076b","updated":"2015-03-16 18:06:57.000000000","message":"Done","commit_id":"953cd5440352c8f1be5aa244399fb93420ec1c31"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"5292a515e380572b4b9a3a37825f8e2486117f09","unresolved":false,"context_lines":[{"line_number":835,"context_line":"    maintenance \u003d NodeMaintenanceController()"},{"line_number":836,"context_line":"    \"\"\"Expose maintenance as a sub-element of nodes\"\"\""},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"    cleaning \u003d NodeCleaningController()"},{"line_number":839,"context_line":"    \"\"\"Expose cleaning as a sub-element of nodes\"\"\""},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    # Set the flag to indicate that the requests to this resource are"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_c13bc6c6","line":838,"updated":"2015-03-16 18:45:44.000000000","message":"Adding the controller in this way makes it visible regardless of the requested API minor version. If you want to hide /nodes/NNN/cleaning from pre-v1.7 (which I think you do) ,then you will need to use a @pecan.expose _route() method. See my patch in 164369 for an example","commit_id":"0e2d228512288688c22e2e2ccdd433edd35b2de7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                           \u0027/target_power_state\u0027, \u0027/target_provision_state\u0027,"},{"line_number":149,"context_line":"                           \u0027/provision_updated_at\u0027, \u0027/maintenance_reason\u0027,"},{"line_number":150,"context_line":"                           \u0027/driver_internal_info\u0027, \u0027/inspection_finished_at\u0027,"},{"line_number":151,"context_line":"                           \u0027/inspection_started_at\u0027, ]"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    @staticmethod"},{"line_number":154,"context_line":"    def mandatory_attrs():"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_49d3785f","line":151,"updated":"2015-03-16 21:00:11.000000000","message":"do we need to add /clean_step here? (I think so but am not positive.)","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":563,"context_line":""},{"line_number":564,"context_line":"    driver_info \u003d {wtypes.text: types.jsontype}"},{"line_number":565,"context_line":"    \"\"\"This node\u0027s driver configuration\"\"\""},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    driver_internal_info \u003d wsme.wsattr({wtypes.text: types.jsontype},"},{"line_number":568,"context_line":"                                       readonly\u003dTrue)"},{"line_number":569,"context_line":"    \"\"\"This driver\u0027s internal configuration\"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_09ec20f3","line":566,"updated":"2015-03-16 21:00:11.000000000","message":"don\u0027t we need to add clean_step somewhere around here?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":812,"context_line":""},{"line_number":813,"context_line":"    @wsme_pecan.wsexpose(types.jsontype, types.uuid_or_name)"},{"line_number":814,"context_line":"    def steps(self, node):"},{"line_number":815,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"        :param node: UUID or name of a node."},{"line_number":818,"context_line":"        :raises: ClientSideError if the node is not in MANAGEABLE state"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_69cf5c2a","line":815,"updated":"2015-03-16 21:00:11.000000000","message":"What if they want to get all the clean steps, enabled and disabled?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"5a0af691bccaf13eba9feb674e5e9c3a05b64066","unresolved":false,"context_lines":[{"line_number":812,"context_line":""},{"line_number":813,"context_line":"    @wsme_pecan.wsexpose(types.jsontype, types.uuid_or_name)"},{"line_number":814,"context_line":"    def steps(self, node):"},{"line_number":815,"context_line":"        \"\"\"Get the node\u0027s enabled clean steps using the node\u0027s name."},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"        :param node: UUID or name of a node."},{"line_number":818,"context_line":"        :raises: ClientSideError if the node is not in MANAGEABLE state"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_55294788","line":815,"in_reply_to":"9a80dd14_69cf5c2a","updated":"2015-09-17 00:18:55.000000000","message":"That would be presented in zapping.","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on."},{"line_number":823,"context_line":"        :raises: NodeGetCleanStepsFailure if there is a failure to get the"},{"line_number":824,"context_line":"            cleaning steps."},{"line_number":825,"context_line":"        :returns: A list of clean steps enabled for the node"},{"line_number":826,"context_line":"        \"\"\""},{"line_number":827,"context_line":"        if not allow_get_clean_steps():"},{"line_number":828,"context_line":"            raise exception.NotAcceptable()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_a4233ba6","line":825,"updated":"2015-03-16 21:00:11.000000000","message":"sorted right? Do we want to mention what info is returned per clean step?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":829,"context_line":"        rpc_node \u003d _get_rpc_node(node)"},{"line_number":830,"context_line":"        if rpc_node.provision_state !\u003d ir_states.MANAGEABLE:"},{"line_number":831,"context_line":"            msg \u003d _(\"Node %s can not be updated while a state transition \""},{"line_number":832,"context_line":"                    \"is in progress.\")"},{"line_number":833,"context_line":"            raise wsme.exc.ClientSideError(msg % node, status_code\u003d409)"},{"line_number":834,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":835,"context_line":"        return pecan.request.rpcapi.get_clean_steps("}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_8938103f","line":832,"updated":"2015-03-16 21:00:11.000000000","message":"This bothers me. A \u0027GET\u0027 shouldn\u0027t modify a node?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"5a0af691bccaf13eba9feb674e5e9c3a05b64066","unresolved":false,"context_lines":[{"line_number":829,"context_line":"        rpc_node \u003d _get_rpc_node(node)"},{"line_number":830,"context_line":"        if rpc_node.provision_state !\u003d ir_states.MANAGEABLE:"},{"line_number":831,"context_line":"            msg \u003d _(\"Node %s can not be updated while a state transition \""},{"line_number":832,"context_line":"                    \"is in progress.\")"},{"line_number":833,"context_line":"            raise wsme.exc.ClientSideError(msg % node, status_code\u003d409)"},{"line_number":834,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":835,"context_line":"        return pecan.request.rpcapi.get_clean_steps("}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_f5487b5e","line":832,"in_reply_to":"9a80dd14_8938103f","updated":"2015-09-17 00:18:55.000000000","message":"That was a bit from deva\u0027s code that I didn\u0027t update.. :(","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"}],"ironic/conductor/manager.py":[{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"0ba518b796dbeb74d6989e5f48962d9c25ca861a","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    \"\"\"Ironic Conductor manager main class.\"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    # NOTE(rloo): This must be in sync with rpcapi.ConductorAPI\u0027s."},{"line_number":194,"context_line":"    RPC_API_VERSION \u003d \u00271.25\u0027"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_e8d4c621","line":194,"updated":"2015-03-05 23:02:48.000000000","message":"see comment on rpcapi.py","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"1c97de74466cc95edd340dcdadad082a7eddfffa","unresolved":false,"context_lines":[{"line_number":968,"context_line":"                        state\u003dtask.node.provision_state)"},{"line_number":969,"context_line":""},{"line_number":970,"context_line":"    def get_clean_steps(self, context, node_id, enabled\u003dTrue):"},{"line_number":971,"context_line":"        \"\"\"RPC method to initiate certain provisioning state transitions."},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"        Initiate a provisioning state change through the state machine,"},{"line_number":974,"context_line":"        rather than through an RPC call to do_node_deploy / do_node_tear_down"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_6a9553e3","line":971,"updated":"2015-02-28 05:00:12.000000000","message":"Docstring description is wrong.","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"1c97de74466cc95edd340dcdadad082a7eddfffa","unresolved":false,"context_lines":[{"line_number":976,"context_line":"        :param context: an admin context."},{"line_number":977,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":978,"context_line":"        :param enabled: If true, only show enabled clean steps (priority \u003e 0)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        \"\"\""},{"line_number":981,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":982,"context_line":"            return [{\u0027step\u0027: step.step, \u0027interface\u0027: step.interface,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_4af7af59","line":979,"updated":"2015-02-28 05:00:12.000000000","message":"returns ?","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"6f5a1ddd109d614e666fe12412dce5492d752488","unresolved":false,"context_lines":[{"line_number":981,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":982,"context_line":"            return [{\u0027step\u0027: step.step, \u0027interface\u0027: step.interface,"},{"line_number":983,"context_line":"                     \u0027priority\u0027: step.priority}"},{"line_number":984,"context_line":"                    for step in _get_cleaning_steps(task, enabled)]"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    @periodic_task.periodic_task("},{"line_number":987,"context_line":"            spacing\u003dCONF.conductor.sync_power_state_interval)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_2a128d62","line":984,"updated":"2015-02-27 17:52:53.000000000","message":"There\u0027s no test case for this method, there probably should be :p","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"659952d82ffe0925fb3e36c9f09d5c198c1b42c0","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        # BootInterface. get_clean_steps for the agent requires the agent"},{"line_number":1014,"context_line":"        # to be booted and running. This won\u0027t guarantee we can get the steps"},{"line_number":1015,"context_line":"        # but getting an agent booted is non-trivial at this point."},{"line_number":1016,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":1017,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1018,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1019,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_2f0a3f79","line":1016,"updated":"2015-03-13 02:18:13.000000000","message":"it seems strange that get_\u003csomething\u003e should acquire a lock on the node, but seems like it is part of the get_clean_steps() passed to the interface.","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c3361f7a68057fd1b692732512a9d1e4a37a0059","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        # BootInterface. get_clean_steps for the agent requires the agent"},{"line_number":1014,"context_line":"        # to be booted and running. This won\u0027t guarantee we can get the steps"},{"line_number":1015,"context_line":"        # but getting an agent booted is non-trivial at this point."},{"line_number":1016,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":1017,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1018,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1019,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_f28ac762","line":1016,"in_reply_to":"9a80dd14_2f0a3f79","updated":"2015-03-13 21:42:18.000000000","message":"I don\u0027t think taking out a shared lock is that strange for this. Exclusive, sure.","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"659952d82ffe0925fb3e36c9f09d5c198c1b42c0","unresolved":false,"context_lines":[{"line_number":1014,"context_line":"        # to be booted and running. This won\u0027t guarantee we can get the steps"},{"line_number":1015,"context_line":"        # but getting an agent booted is non-trivial at this point."},{"line_number":1016,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":1017,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1018,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1019,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"},{"line_number":1020,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_0f673b4e","line":1017,"updated":"2015-03-13 02:18:13.000000000","message":"Just powering on cannot guarantee that we can get inband cleaning steps - will there be some other exceptions ? might need to revisit this later on.","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c3361f7a68057fd1b692732512a9d1e4a37a0059","unresolved":false,"context_lines":[{"line_number":1014,"context_line":"        # to be booted and running. This won\u0027t guarantee we can get the steps"},{"line_number":1015,"context_line":"        # but getting an agent booted is non-trivial at this point."},{"line_number":1016,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":1017,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1018,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1019,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"},{"line_number":1020,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_32f0dffd","line":1017,"in_reply_to":"9a80dd14_0f673b4e","updated":"2015-03-13 21:42:18.000000000","message":"Right, noted in the comment above. I\u0027ll add the exceptions to expected exception.","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"659952d82ffe0925fb3e36c9f09d5c198c1b42c0","unresolved":false,"context_lines":[{"line_number":1015,"context_line":"        # but getting an agent booted is non-trivial at this point."},{"line_number":1016,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":1017,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1018,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1019,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"},{"line_number":1020,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"},{"line_number":1021,"context_line":"                    {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_ef05877a","line":1018,"updated":"2015-03-13 02:18:13.000000000","message":"need to add this to @messaging.expected_exceptions.\n\nAlso need to add NodeNotFound, NodeLocked","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0947b57fc9640a3f8505af45c26187559c272fcd","unresolved":false,"context_lines":[{"line_number":1010,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":1011,"context_line":"        :param enabled: If True, only return enabled (priority \u003e 0) clean"},{"line_number":1012,"context_line":"            steps. If False, return all clean steps."},{"line_number":1013,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on"},{"line_number":1014,"context_line":"        :returns: A list of clean step dictionaries"},{"line_number":1015,"context_line":"        \"\"\""},{"line_number":1016,"context_line":"        # TODO(JoshNang) This error should be removed when we go to"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_e2ce6c59","line":1013,"updated":"2015-03-13 12:06:17.000000000","message":"And NodeCleaningFailure.","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fff053997d9709952ffe2c6e90c586bde2831b2f","unresolved":false,"context_lines":[{"line_number":1010,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":1011,"context_line":"        :param enabled: If True, only return enabled (priority \u003e 0) clean"},{"line_number":1012,"context_line":"            steps. If False, return all clean steps."},{"line_number":1013,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on"},{"line_number":1014,"context_line":"        :returns: A list of clean step dictionaries"},{"line_number":1015,"context_line":"        \"\"\""},{"line_number":1016,"context_line":"        # TODO(JoshNang) This error should be removed when we go to"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_22d068c8","line":1013,"in_reply_to":"9a80dd14_e2ce6c59","updated":"2015-03-13 21:41:55.000000000","message":"Done","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0947b57fc9640a3f8505af45c26187559c272fcd","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on"},{"line_number":1014,"context_line":"        :returns: A list of clean step dictionaries"},{"line_number":1015,"context_line":"        \"\"\""},{"line_number":1016,"context_line":"        # TODO(JoshNang) This error should be removed when we go to"},{"line_number":1017,"context_line":"        # BootInterface. get_clean_steps for the agent requires the agent"},{"line_number":1018,"context_line":"        # to be booted and running. This won\u0027t guarantee we can get the steps"},{"line_number":1019,"context_line":"        # but getting an agent booted is non-trivial at this point."}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_2271640c","line":1016,"updated":"2015-03-13 12:06:17.000000000","message":"Sorry I do not understand what error you mentioned in this comment, please move to proper place.","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fff053997d9709952ffe2c6e90c586bde2831b2f","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on"},{"line_number":1014,"context_line":"        :returns: A list of clean step dictionaries"},{"line_number":1015,"context_line":"        \"\"\""},{"line_number":1016,"context_line":"        # TODO(JoshNang) This error should be removed when we go to"},{"line_number":1017,"context_line":"        # BootInterface. get_clean_steps for the agent requires the agent"},{"line_number":1018,"context_line":"        # to be booted and running. This won\u0027t guarantee we can get the steps"},{"line_number":1019,"context_line":"        # but getting an agent booted is non-trivial at this point."}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_c2706c0a","line":1016,"in_reply_to":"9a80dd14_2271640c","updated":"2015-03-13 21:41:55.000000000","message":"Sorry, one line up too far.","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"eabb8cc76762d9a47afc8abc78a588f32bca2dfc","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"                     \u0027state\u0027: task.node.power_state,"},{"line_number":1027,"context_line":"                     \u0027on\u0027: states.POWER_ON})"},{"line_number":1028,"context_line":"            try:"},{"line_number":1029,"context_line":"                return _get_cleaning_steps(task, enabled)"},{"line_number":1030,"context_line":"            except Exception as e:"},{"line_number":1031,"context_line":"                raise exception.NodeCleaningFailure("},{"line_number":1032,"context_line":"                    \u0027Could not get cleaning steps for node %(node)s because: \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_3038c59f","line":1029,"updated":"2015-03-13 14:19:36.000000000","message":"We would end up talking to the baremetal synchronously on a GET API call here.\n\nIt should be fine because:\n* Agent is an openstack service and is fast\n\nIt might not be fine because:\n* How fast agent responds depends on the resources in the agent (getting clean steps from agent can be slow on slower machines) and decides whether api will timeout or not.\n\nMay be in my opinion \"should be fine\" wins.","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fff053997d9709952ffe2c6e90c586bde2831b2f","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"                     \u0027state\u0027: task.node.power_state,"},{"line_number":1027,"context_line":"                     \u0027on\u0027: states.POWER_ON})"},{"line_number":1028,"context_line":"            try:"},{"line_number":1029,"context_line":"                return _get_cleaning_steps(task, enabled)"},{"line_number":1030,"context_line":"            except Exception as e:"},{"line_number":1031,"context_line":"                raise exception.NodeCleaningFailure("},{"line_number":1032,"context_line":"                    \u0027Could not get cleaning steps for node %(node)s because: \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_42855ccd","line":1029,"in_reply_to":"9a80dd14_3038c59f","updated":"2015-03-13 21:41:55.000000000","message":"I agree the \"should be fine\" bit wins. Everything in tree or proposed to tree will easily fit within a second or two (in the worst case). If people are adding things to get_clean_steps that are taking longer than the timeout, that should be a bug. And if someone makes a really good reason why it should be like that, we can make this an async API (or just async everything!)","commit_id":"eb8c57358ea71207ab7d5a1326fabe872709ad84"},{"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":"8d3a1b404df410a5510ce335b7192835ce8eea76","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            # BootInterface. get_clean_steps for the agent requires the agent"},{"line_number":1039,"context_line":"            # to be booted and running. This won\u0027t guarantee we can get the"},{"line_number":1040,"context_line":"            # steps but getting an agent booted is non-trivial at this point."},{"line_number":1041,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1042,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1043,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"},{"line_number":1044,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_2e25af5b","line":1041,"updated":"2015-03-13 22:48:34.000000000","message":"I agree with this decision (obviously, we talked about it), but I do think it\u0027s prudent for us to file a bug about this once it merges to ensure it gets fixed.","commit_id":"953cd5440352c8f1be5aa244399fb93420ec1c31"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"46ea660ab705d837f706741b728e7499076c24a5","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            # BootInterface. get_clean_steps for the agent requires the agent"},{"line_number":1039,"context_line":"            # to be booted and running. This won\u0027t guarantee we can get the"},{"line_number":1040,"context_line":"            # steps but getting an agent booted is non-trivial at this point."},{"line_number":1041,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1042,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1043,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"},{"line_number":1044,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_506c02d1","line":1041,"in_reply_to":"9a80dd14_2e25af5b","updated":"2015-03-16 18:06:57.000000000","message":"https://bugs.launchpad.net/ironic/+bug/1432761 I think there\u0027s some easy wins like caching clean steps that could help mitigate this.","commit_id":"953cd5440352c8f1be5aa244399fb93420ec1c31"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"952a0856023aa4c94207dd65e7d82b0aaacdd673","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"            try:"},{"line_number":1049,"context_line":"                return _get_cleaning_steps(task, enabled)"},{"line_number":1050,"context_line":"            except Exception as e:"},{"line_number":1051,"context_line":"                raise exception.NodeCleaningFailure("},{"line_number":1052,"context_line":"                    \u0027Could not get cleaning steps for node %(node)s because: \u0027"},{"line_number":1053,"context_line":"                    \u0027%(e)s\u0027 % {\u0027node\u0027: task.node.uuid, \u0027e\u0027: e})"},{"line_number":1054,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_26e946e6","line":1051,"updated":"2015-03-15 10:58:27.000000000","message":"NodeCleaningFailure doesn\u0027t seem to be a suited exception when we cannot get the clean steps (though we change the description).  It says something happened while cleaning.","commit_id":"953cd5440352c8f1be5aa244399fb93420ec1c31"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"46ea660ab705d837f706741b728e7499076c24a5","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"            try:"},{"line_number":1049,"context_line":"                return _get_cleaning_steps(task, enabled)"},{"line_number":1050,"context_line":"            except Exception as e:"},{"line_number":1051,"context_line":"                raise exception.NodeCleaningFailure("},{"line_number":1052,"context_line":"                    \u0027Could not get cleaning steps for node %(node)s because: \u0027"},{"line_number":1053,"context_line":"                    \u0027%(e)s\u0027 % {\u0027node\u0027: task.node.uuid, \u0027e\u0027: e})"},{"line_number":1054,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_b020def9","line":1051,"in_reply_to":"9a80dd14_26e946e6","updated":"2015-03-16 18:06:57.000000000","message":"Done","commit_id":"953cd5440352c8f1be5aa244399fb93420ec1c31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"                                   exception.NodeInWrongPowerState,"},{"line_number":1021,"context_line":"                                   exception.NodeGetCleanStepsFailure)"},{"line_number":1022,"context_line":"    def get_clean_steps(self, context, node_id, enabled\u003dTrue):"},{"line_number":1023,"context_line":"        \"\"\"Get the list of enabled cleaning/zapping steps."},{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"        :param context: an admin context."},{"line_number":1026,"context_line":"        :param node_id: the id or uuid of a node."}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_c958485a","line":1023,"updated":"2015-03-16 21:00:11.000000000","message":"I don\u0027t think \u0027enabled\u0027 should be here because it depends on the \u0027enabled\u0027 parameter as to whether you return only enabled steps.","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"5a0af691bccaf13eba9feb674e5e9c3a05b64066","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"                                   exception.NodeInWrongPowerState,"},{"line_number":1021,"context_line":"                                   exception.NodeGetCleanStepsFailure)"},{"line_number":1022,"context_line":"    def get_clean_steps(self, context, node_id, enabled\u003dTrue):"},{"line_number":1023,"context_line":"        \"\"\"Get the list of enabled cleaning/zapping steps."},{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"        :param context: an admin context."},{"line_number":1026,"context_line":"        :param node_id: the id or uuid of a node."}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_756c8bd1","line":1023,"in_reply_to":"9a80dd14_c958485a","updated":"2015-09-17 00:18:55.000000000","message":"That was to let this be used by zapping in the future.","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on."},{"line_number":1032,"context_line":"        :raises: NodeGetCleanStepsFailure if there is a failure to get the"},{"line_number":1033,"context_line":"            cleaning steps."},{"line_number":1034,"context_line":"        :returns: A list of clean step dictionaries"},{"line_number":1035,"context_line":"        \"\"\""},{"line_number":1036,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":1037,"context_line":"            # TODO(JoshNang) This error should be removed when we go to"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_041b2774","line":1034,"updated":"2015-03-16 21:00:11.000000000","message":"sorted, right?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"5a0af691bccaf13eba9feb674e5e9c3a05b64066","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on."},{"line_number":1032,"context_line":"        :raises: NodeGetCleanStepsFailure if there is a failure to get the"},{"line_number":1033,"context_line":"            cleaning steps."},{"line_number":1034,"context_line":"        :returns: A list of clean step dictionaries"},{"line_number":1035,"context_line":"        \"\"\""},{"line_number":1036,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue) as task:"},{"line_number":1037,"context_line":"            # TODO(JoshNang) This error should be removed when we go to"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_f55f9b0d","line":1034,"in_reply_to":"9a80dd14_041b2774","updated":"2015-09-17 00:18:55.000000000","message":"Correct.","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"1ecdef95f6c2857aea1a9a25cca07b30f7db272b","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            # BootInterface. get_clean_steps for the agent requires the agent"},{"line_number":1039,"context_line":"            # to be booted and running. This won\u0027t guarantee we can get the"},{"line_number":1040,"context_line":"            # steps but getting an agent booted is non-trivial at this point."},{"line_number":1041,"context_line":"            if task.node.power_state !\u003d states.POWER_ON:"},{"line_number":1042,"context_line":"                raise exception.NodeInWrongPowerState("},{"line_number":1043,"context_line":"                    \u0027Cannot get clean steps for node %(node)s in power state \u0027"},{"line_number":1044,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_d846147b","line":1041,"updated":"2015-03-17 21:49:10.000000000","message":"If a driver implements all cleaning steps out-of-band, then the node doesn\u0027t need to be in powered on state in order to get clean steps.  It seems to me this state requirement should driver specific. right?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"},{"line_number":1045,"context_line":"                    {\u0027node\u0027: task.node.uuid,"},{"line_number":1046,"context_line":"                     \u0027state\u0027: task.node.power_state,"},{"line_number":1047,"context_line":"                     \u0027on\u0027: states.POWER_ON})"},{"line_number":1048,"context_line":"            try:"},{"line_number":1049,"context_line":"                return _get_cleaning_steps(task, enabled)"},{"line_number":1050,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_84f1d703","line":1047,"updated":"2015-03-16 21:00:11.000000000","message":"Is this specific to the agent? I feel like this should be pushed down a level to eg in _get_cleaning_steps(), why doesn\u0027t the call to interface.get_clean_steps() barf?\n\nIf this is a temporary thing, I also think that it might be better to raise exception.NodeGetCleanStepsFailure() (with that message) instead of NodeInWrongPowerState().","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"5a0af691bccaf13eba9feb674e5e9c3a05b64066","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"                    \u0027%(state)s, state must be \"%(on)s\".\u0027 %"},{"line_number":1045,"context_line":"                    {\u0027node\u0027: task.node.uuid,"},{"line_number":1046,"context_line":"                     \u0027state\u0027: task.node.power_state,"},{"line_number":1047,"context_line":"                     \u0027on\u0027: states.POWER_ON})"},{"line_number":1048,"context_line":"            try:"},{"line_number":1049,"context_line":"                return _get_cleaning_steps(task, enabled)"},{"line_number":1050,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_957f3f66","line":1047,"in_reply_to":"9a80dd14_84f1d703","updated":"2015-09-17 00:18:55.000000000","message":"Yeah, this is specific to IPA. I\u0027m fine pushing it down. Though with this getting bumped to L, maybe we\u0027ll have a better solution.","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"0ba518b796dbeb74d6989e5f48962d9c25ca861a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    \"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    # NOTE(rloo): This must be in sync with manager.ConductorManager\u0027s."},{"line_number":75,"context_line":"    RPC_API_VERSION \u003d \u00271.25\u0027"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self, topic\u003dNone):"},{"line_number":78,"context_line":"        super(ConductorAPI, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_68fa96be","line":75,"updated":"2015-03-05 23:02:48.000000000","message":"this will conflict with : https://review.openstack.org/#/c/155561","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"0ba518b796dbeb74d6989e5f48962d9c25ca861a","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                          node_id\u003dnode_id)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def get_clean_steps(self, context, node_id, topic\u003dNone, enabled\u003dTrue):"},{"line_number":362,"context_line":"        \"\"\"Validate the `core` and `standardized` interfaces for drivers."},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        :param context: request context."},{"line_number":365,"context_line":"        :param node_id: node id or uuid."}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_08a67ac1","line":362,"updated":"2015-03-05 23:02:48.000000000","message":"doc string seems incorrect here. could be cut and paste artifact.","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9789b71f591d98346e8ab6ac0cc6ed0600618ac1","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":367,"context_line":"        :param enabled: If true, only show enabled clean steps (priority \u003e 0)"},{"line_number":368,"context_line":"        :returns: a dictionary containing the results of each"},{"line_number":369,"context_line":"                  interface validation."},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        \"\"\""},{"line_number":372,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.25\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_c506e985","line":369,"updated":"2015-03-06 15:31:23.000000000","message":"This :returns: also seems to be incorrect.","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"659952d82ffe0925fb3e36c9f09d5c198c1b42c0","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        :param enabled: If true, only show enabled clean steps (priority \u003e 0)"},{"line_number":353,"context_line":"        :returns: a dictionary containing the results of each"},{"line_number":354,"context_line":"                  interface validation."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        \"\"\""},{"line_number":357,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.26\u0027)"},{"line_number":358,"context_line":"        return cctxt.call(context, \u0027get_clean_steps\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_6f55174f","line":355,"updated":"2015-03-13 02:18:13.000000000","message":"missing raises","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"1ecdef95f6c2857aea1a9a25cca07b30f7db272b","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":355,"context_line":"        :raises: NodeNotFound if the node no longer appears in the database."},{"line_number":356,"context_line":"        :raises: NodeInWrongPowerState if the node is not powered on."},{"line_number":357,"context_line":"        :raises: NodeGetCleanStepsFailure if there is a failure to get the"},{"line_number":358,"context_line":"            cleaning steps."},{"line_number":359,"context_line":"        :returns: a dictionary containing the results of each"},{"line_number":360,"context_line":"                  interface validation."}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_bb0ebae3","line":357,"updated":"2015-03-17 21:49:10.000000000","message":"ditto.  It seems to me that the power-on state requirement should be driver specific.  Driver that does all cleaning steps out-of-band does not require managed node to be in power-on state. right?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7cd9e394f96eaead0aa8b41c09a48d55eccb9294","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        :raises: NodeGetCleanStepsFailure if there is a failure to get the"},{"line_number":358,"context_line":"            cleaning steps."},{"line_number":359,"context_line":"        :returns: a dictionary containing the results of each"},{"line_number":360,"context_line":"                  interface validation."},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        \"\"\""},{"line_number":363,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.27\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_a9add434","line":360,"updated":"2015-03-16 21:00:11.000000000","message":"huh? Is this a copy/paste error or what do you mean by \u0027interface validation\u0027?","commit_id":"df49f93d4db6f92ad24de553944899eeafe00833"}],"ironic/tests/api/v1/test_nodes.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"6f5a1ddd109d614e666fe12412dce5492d752488","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        self.get_json(\u0027/nodes/%s/cleaning/steps\u0027 % node.uuid,"},{"line_number":720,"context_line":"                      headers\u003d{api_base.Version.string: \"1.6\"})"},{"line_number":721,"context_line":"        mock_clean_steps.assert_called_once_with(mock.ANY, node.uuid,"},{"line_number":722,"context_line":"                                                 \u0027test-topic\u0027, enabled\u003dTrue)"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"class TestPatch(test_api_base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_8a5a994e","line":722,"updated":"2015-02-27 17:52:53.000000000","message":"I\u0027d like to assert something about the status code and response, I think.\n\nI\u0027d also like a second test with a version less than 1.6","commit_id":"e44a0380b9e4caa398c5ce0bccc3d7c4427a0320"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"659952d82ffe0925fb3e36c9f09d5c198c1b42c0","unresolved":false,"context_lines":[{"line_number":759,"context_line":"                             expect_errors\u003dTrue)"},{"line_number":760,"context_line":"        mock_clean_steps.assert_called_once_with(mock.ANY, node.uuid,"},{"line_number":761,"context_line":"                                                 \u0027test-topic\u0027, enabled\u003dTrue)"},{"line_number":762,"context_line":"        self.assertEqual(409, data.status_code)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"class TestPatch(test_api_base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_efef4785","line":762,"updated":"2015-03-13 02:18:13.000000000","message":"assert data.json[\u0027error_message\u0027])","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"c3361f7a68057fd1b692732512a9d1e4a37a0059","unresolved":false,"context_lines":[{"line_number":759,"context_line":"                             expect_errors\u003dTrue)"},{"line_number":760,"context_line":"        mock_clean_steps.assert_called_once_with(mock.ANY, node.uuid,"},{"line_number":761,"context_line":"                                                 \u0027test-topic\u0027, enabled\u003dTrue)"},{"line_number":762,"context_line":"        self.assertEqual(409, data.status_code)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"class TestPatch(test_api_base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_52a393ff","line":762,"in_reply_to":"9a80dd14_efef4785","updated":"2015-03-13 21:42:18.000000000","message":"Done","commit_id":"061ab467bfb7f719437483b02227756df977d1ab"}]}
