)]}'
{"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        pecan.response.location \u003d link.build_url(\u0027nodes\u0027, url_args)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":420,"context_line":"                   wtypes.text, wtypes.text, status_code\u003dhttp_client.ACCEPTED)"},{"line_number":421,"context_line":"    def provision(self, node_ident, target, configdrive\u003dNone, zap_steps\u003dNone):"},{"line_number":422,"context_line":"        \"\"\"Asynchronous trigger the provisioning of the node."},{"line_number":423,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_cfe4fa3c","line":420,"updated":"2015-09-14 16:51:36.000000000","message":"I think we should be explicit about type of zap_steps, not just \"text\". I don\u0027t see the real type validated anywhere, which will probably give us HTTP 500 on a malformed input (e.g. a plain string is passed).","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        pecan.response.location \u003d link.build_url(\u0027nodes\u0027, url_args)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":420,"context_line":"                   wtypes.text, wtypes.text, status_code\u003dhttp_client.ACCEPTED)"},{"line_number":421,"context_line":"    def provision(self, node_ident, target, configdrive\u003dNone, zap_steps\u003dNone):"},{"line_number":422,"context_line":"        \"\"\"Asynchronous trigger the provisioning of the node."},{"line_number":423,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_5a3f3fb4","line":420,"in_reply_to":"ba15a1d1_cfe4fa3c","updated":"2015-09-15 00:25:05.000000000","message":"It\u0027s validated for correctness in the conductor, but agreed, this can be better.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            configdrive. Only valid when setting provision state"},{"line_number":435,"context_line":"            to \"active\"."},{"line_number":436,"context_line":"        :param zap_steps: Optional. A list of dictionaries representing"},{"line_number":437,"context_line":"            zap steps to execute in order."},{"line_number":438,"context_line":"        :raises: NodeLocked (HTTP 409) if the node is currently locked."},{"line_number":439,"context_line":"        :raises: ClientSideError (HTTP 409) if the node is already being"},{"line_number":440,"context_line":"                 provisioned."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_a9942937","line":437,"updated":"2015-09-14 16:49:14.000000000","message":"Should we mention (like with configdrive), \u0027Must be specified when setting provision state to \"zap\", and invalid for other provisioning targets\u0027?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            configdrive. Only valid when setting provision state"},{"line_number":435,"context_line":"            to \"active\"."},{"line_number":436,"context_line":"        :param zap_steps: Optional. A list of dictionaries representing"},{"line_number":437,"context_line":"            zap steps to execute in order."},{"line_number":438,"context_line":"        :raises: NodeLocked (HTTP 409) if the node is currently locked."},{"line_number":439,"context_line":"        :raises: ClientSideError (HTTP 409) if the node is already being"},{"line_number":440,"context_line":"                 provisioned."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_3aa4cba4","line":437,"in_reply_to":"ba15a1d1_a9942937","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":475,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.ACTIVE)"},{"line_number":476,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":477,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        # Note that there is a race condition. The node state(s) could change"},{"line_number":480,"context_line":"        # by the time the RPC call is made and the TaskManager manager gets a"},{"line_number":481,"context_line":"        # lock."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_be03fa0e","line":478,"updated":"2015-09-14 16:49:14.000000000","message":"if zap_steps and target !\u003d ir_states.VERBS[\u0027zap\u0027]... ?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":475,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.ACTIVE)"},{"line_number":476,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":477,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        # Note that there is a race condition. The node state(s) could change"},{"line_number":480,"context_line":"        # by the time the RPC call is made and the TaskManager manager gets a"},{"line_number":481,"context_line":"        # lock."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_f5774400","line":478,"in_reply_to":"ba15a1d1_be03fa0e","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":499,"context_line":"                pecan.request.context, rpc_node.uuid, target, topic)"},{"line_number":500,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":501,"context_line":"            pecan.request.rpcapi.do_node_zap("},{"line_number":502,"context_line":"                pecan.request.context, rpc_node.uuid, zap_steps, topic)"},{"line_number":503,"context_line":"        else:"},{"line_number":504,"context_line":"            msg \u003d (_(\u0027The requested action \"%(action)s\" could not be \u0027"},{"line_number":505,"context_line":"                     \u0027understood.\u0027) % {\u0027action\u0027: target})"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_de258ec2","line":502,"updated":"2015-09-14 16:49:14.000000000","message":"should check that zap_steps is not None.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":499,"context_line":"                pecan.request.context, rpc_node.uuid, target, topic)"},{"line_number":500,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":501,"context_line":"            pecan.request.rpcapi.do_node_zap("},{"line_number":502,"context_line":"                pecan.request.context, rpc_node.uuid, zap_steps, topic)"},{"line_number":503,"context_line":"        else:"},{"line_number":504,"context_line":"            msg \u003d (_(\u0027The requested action \"%(action)s\" could not be \u0027"},{"line_number":505,"context_line":"                     \u0027understood.\u0027) % {\u0027action\u0027: target})"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_157518f8","line":502,"in_reply_to":"ba15a1d1_de258ec2","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"54154081df0b63c82fafdfcd056b9f44c0acaa5c","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                pecan.request.context, rpc_node.uuid, target, topic)"},{"line_number":507,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":508,"context_line":"            if not zap_steps:"},{"line_number":509,"context_line":"                msg \u003d (_(\u0027\"zap_steps\" is only valid when setting provision \u0027"},{"line_number":510,"context_line":"                         \u0027state to %s\u0027) % ir_states.ZAPPING)"},{"line_number":511,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":512,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_ee9bbd70","line":509,"updated":"2015-09-15 23:42:52.000000000","message":"This error seems like copy pasta, should be \"zap_steps is require when...\"","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e202c4cd1ff11959df14cb716dad77e73cfc2d28","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                pecan.request.context, rpc_node.uuid, target, topic)"},{"line_number":507,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":508,"context_line":"            if not zap_steps:"},{"line_number":509,"context_line":"                msg \u003d (_(\u0027\"zap_steps\" is only valid when setting provision \u0027"},{"line_number":510,"context_line":"                         \u0027state to %s\u0027) % ir_states.ZAPPING)"},{"line_number":511,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":512,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_f1c4fc5f","line":509,"in_reply_to":"ba15a1d1_ee9bbd70","updated":"2015-09-16 00:04:20.000000000","message":"Done","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08666920502f209b81fd54a1b30a12834825093f","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        pecan.response.location \u003d link.build_url(\u0027nodes\u0027, url_args)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":420,"context_line":"                   wtypes.text, wtypes.text, status_code\u003dhttp_client.ACCEPTED)"},{"line_number":421,"context_line":"    def provision(self, node_ident, target, configdrive\u003dNone, zap_steps\u003dNone):"},{"line_number":422,"context_line":"        \"\"\"Asynchronous trigger the provisioning of the node."},{"line_number":423,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_e81f2306","line":420,"updated":"2015-09-16 10:17:45.000000000","message":"zap_steps should be at least JsonType, or better something more specific","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        pecan.response.location \u003d link.build_url(\u0027nodes\u0027, url_args)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":420,"context_line":"                   wtypes.text, wtypes.text, status_code\u003dhttp_client.ACCEPTED)"},{"line_number":421,"context_line":"    def provision(self, node_ident, target, configdrive\u003dNone, zap_steps\u003dNone):"},{"line_number":422,"context_line":"        \"\"\"Asynchronous trigger the provisioning of the node."},{"line_number":423,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_4077f4d2","line":420,"in_reply_to":"ba15a1d1_e81f2306","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":435,"context_line":"            to \"active\"."},{"line_number":436,"context_line":"        :param zap_steps: Optional. A list of dictionaries representing"},{"line_number":437,"context_line":"            zap steps to execute in order. Only valid and must be provided when"},{"line_number":438,"context_line":"            setting provision state to \"zapping\"."},{"line_number":439,"context_line":"        :raises: NodeLocked (HTTP 409) if the node is currently locked."},{"line_number":440,"context_line":"        :raises: ClientSideError (HTTP 409) if the node is already being"},{"line_number":441,"context_line":"                 provisioned."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_1522b5b9","line":438,"updated":"2015-09-16 07:50:53.000000000","message":"s/zapping/zap ?","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":435,"context_line":"            to \"active\"."},{"line_number":436,"context_line":"        :param zap_steps: Optional. A list of dictionaries representing"},{"line_number":437,"context_line":"            zap steps to execute in order. Only valid and must be provided when"},{"line_number":438,"context_line":"            setting provision state to \"zapping\"."},{"line_number":439,"context_line":"        :raises: NodeLocked (HTTP 409) if the node is currently locked."},{"line_number":440,"context_line":"        :raises: ClientSideError (HTTP 409) if the node is already being"},{"line_number":441,"context_line":"                 provisioned."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_e0564829","line":438,"in_reply_to":"ba15a1d1_1522b5b9","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":477,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":478,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        if zap_steps and target !\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":481,"context_line":"            msg \u003d (_(\u0027\"zap_steps\" is only valid when setting provision state \u0027"},{"line_number":482,"context_line":"                     \u0027to %s\u0027) % ir_states.ZAPPING)"},{"line_number":483,"context_line":"            raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_f8b13890","line":480,"updated":"2015-09-16 07:50:53.000000000","message":"Missing test cases for this code.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":477,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":478,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        if zap_steps and target !\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":481,"context_line":"            msg \u003d (_(\u0027\"zap_steps\" is only valid when setting provision state \u0027"},{"line_number":482,"context_line":"                     \u0027to %s\u0027) % ir_states.ZAPPING)"},{"line_number":483,"context_line":"            raise wsme.exc.ClientSideError("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_0f05a744","line":480,"in_reply_to":"ba15a1d1_f8b13890","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        if zap_steps and target !\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":481,"context_line":"            msg \u003d (_(\u0027\"zap_steps\" is only valid when setting provision state \u0027"},{"line_number":482,"context_line":"                     \u0027to %s\u0027) % ir_states.ZAPPING)"},{"line_number":483,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":484,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":485,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_e3c2d233","line":482,"updated":"2015-09-16 17:25:03.000000000","message":"that should be s/ir_states.ZAPPING/ir_states.VERBS[\u0027zap\u0027]/\n\ncuz the user has to specify \u0027zap\u0027, not \u0027zapping\u0027.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        if zap_steps and target !\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":481,"context_line":"            msg \u003d (_(\u0027\"zap_steps\" is only valid when setting provision state \u0027"},{"line_number":482,"context_line":"                     \u0027to %s\u0027) % ir_states.ZAPPING)"},{"line_number":483,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":484,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":485,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_4fe63fb1","line":482,"in_reply_to":"ba15a1d1_e3c2d233","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":504,"context_line":"                ir_states.VERBS[\u0027manage\u0027], ir_states.VERBS[\u0027provide\u0027]):"},{"line_number":505,"context_line":"            pecan.request.rpcapi.do_provisioning_action("},{"line_number":506,"context_line":"                pecan.request.context, rpc_node.uuid, target, topic)"},{"line_number":507,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":508,"context_line":"            if not zap_steps:"},{"line_number":509,"context_line":"                msg \u003d (_(\u0027\"zap_steps\" is required when setting provision \u0027"},{"line_number":510,"context_line":"                         \u0027state to %s\u0027) % ir_states.ZAPPING)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_d8a6b452","line":507,"updated":"2015-09-16 07:50:53.000000000","message":"Missing test cases for this code.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":504,"context_line":"                ir_states.VERBS[\u0027manage\u0027], ir_states.VERBS[\u0027provide\u0027]):"},{"line_number":505,"context_line":"            pecan.request.rpcapi.do_provisioning_action("},{"line_number":506,"context_line":"                pecan.request.context, rpc_node.uuid, target, topic)"},{"line_number":507,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":508,"context_line":"            if not zap_steps:"},{"line_number":509,"context_line":"                msg \u003d (_(\u0027\"zap_steps\" is required when setting provision \u0027"},{"line_number":510,"context_line":"                         \u0027state to %s\u0027) % ir_states.ZAPPING)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8fbe9763","line":507,"in_reply_to":"ba15a1d1_d8a6b452","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":507,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":508,"context_line":"            if not zap_steps:"},{"line_number":509,"context_line":"                msg \u003d (_(\u0027\"zap_steps\" is required when setting provision \u0027"},{"line_number":510,"context_line":"                         \u0027state to %s\u0027) % ir_states.ZAPPING)"},{"line_number":511,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":512,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":513,"context_line":"            pecan.request.rpcapi.do_node_zap("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_23d44aea","line":510,"updated":"2015-09-16 17:25:03.000000000","message":"s/ir_states.ZAPPING/ir_states.VERBS(\u0027zap\u0027)/","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":507,"context_line":"        elif target \u003d\u003d ir_states.VERBS[\u0027zap\u0027]:"},{"line_number":508,"context_line":"            if not zap_steps:"},{"line_number":509,"context_line":"                msg \u003d (_(\u0027\"zap_steps\" is required when setting provision \u0027"},{"line_number":510,"context_line":"                         \u0027state to %s\u0027) % ir_states.ZAPPING)"},{"line_number":511,"context_line":"                raise wsme.exc.ClientSideError("},{"line_number":512,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":513,"context_line":"            pecan.request.rpcapi.do_node_zap("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_0f8cc7d8","line":510,"in_reply_to":"ba15a1d1_23d44aea","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"}],"ironic/conductor/manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":830,"context_line":"                state\u003dnode.provision_state)"},{"line_number":831,"context_line":"        self._do_node_clean(task)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"    def do_node_zap(self, context, node_id, zap_steps):"},{"line_number":834,"context_line":"        \"\"\"RPC method to initiate zapping"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_7ec1e2e3","line":833,"updated":"2015-09-14 16:49:14.000000000","message":"should probably add the @messaging.expected_exceptions() decorator.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":830,"context_line":"                state\u003dnode.provision_state)"},{"line_number":831,"context_line":"        self._do_node_clean(task)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"    def do_node_zap(self, context, node_id, zap_steps):"},{"line_number":834,"context_line":"        \"\"\"RPC method to initiate zapping"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_cd94f838","line":833,"in_reply_to":"ba15a1d1_7ec1e2e3","updated":"2015-09-15 00:25:05.000000000","message":"Oh, duh. Thanks!","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":831,"context_line":"        self._do_node_clean(task)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"    def do_node_zap(self, context, node_id, zap_steps):"},{"line_number":834,"context_line":"        \"\"\"RPC method to initiate zapping"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."},{"line_number":837,"context_line":"        :param node_id: the id or uuid of a node."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_486d4b03","line":834,"updated":"2015-09-14 15:02:13.000000000","message":"Nit: needs a period.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":831,"context_line":"        self._do_node_clean(task)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"    def do_node_zap(self, context, node_id, zap_steps):"},{"line_number":834,"context_line":"        \"\"\"RPC method to initiate zapping"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."},{"line_number":837,"context_line":"        :param node_id: the id or uuid of a node."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_edad3c89","line":834,"in_reply_to":"ba15a1d1_486d4b03","updated":"2015-09-15 00:25:05.000000000","message":"Surprised this isn\u0027t caught by hacking, tbh. Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."},{"line_number":837,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":838,"context_line":"        :param zap_steps: the list of zap steps to perform on the node"},{"line_number":839,"context_line":"        :raises: InvalidParameterValue"},{"line_number":840,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":841,"context_line":"            zapfail state"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c9aabd19","line":838,"updated":"2015-09-14 16:49:14.000000000","message":"a dictionary, right? I would like a description of what is in the dictionary somewhere in the code. Seems overkill to describe it each time we have a method with zap_steps, but my memory is so bad...","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."},{"line_number":837,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":838,"context_line":"        :param zap_steps: the list of zap steps to perform on the node"},{"line_number":839,"context_line":"        :raises: InvalidParameterValue"},{"line_number":840,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":841,"context_line":"            zapfail state"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_6de816b5","line":838,"in_reply_to":"ba15a1d1_0bf4ed83","updated":"2015-09-15 22:44:37.000000000","message":"Zap steps are \u0027step\u0027, \u0027interface\u0027 and any required kwargs when POSTing them and using them. When getting a list of all_steps, zap steps are \u0027step\u0027, \u0027interface\u0027, \u0027cleaning_priority\u0027, and \u0027required_args\u0027 (a list of required args).","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"173ec9bf457d5e81cced600d1b32bd435cdee895","unresolved":false,"context_lines":[{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."},{"line_number":837,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":838,"context_line":"        :param zap_steps: the list of zap steps to perform on the node"},{"line_number":839,"context_line":"        :raises: InvalidParameterValue"},{"line_number":840,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":841,"context_line":"            zapfail state"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_0bf4ed83","line":838,"in_reply_to":"ba15a1d1_adb664da","updated":"2015-09-15 19:05:54.000000000","message":"I did a quick search and couldn\u0027t find where the clean step was documented. However, I did find the code in drivers/base.py, where a clean step is created, and it is a dictionary with these keys: \u0027step\u0027, \u0027priority\u0027, \u0027interface\u0027.\n\nI thought a zap step is the above + the key \u0027required_args\u0027?\n\nAlthough your spec shows \u0027cleaning_priority\u0027, not \u0027priority\u0027.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        :param context: an admin context."},{"line_number":837,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":838,"context_line":"        :param zap_steps: the list of zap steps to perform on the node"},{"line_number":839,"context_line":"        :raises: InvalidParameterValue"},{"line_number":840,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":841,"context_line":"            zapfail state"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_adb664da","line":838,"in_reply_to":"ba15a1d1_c9aabd19","updated":"2015-09-15 00:25:05.000000000","message":"Nah it\u0027s fine, I described what a clean step is in like 4 spots","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            # Save the zap steps to the node and reset zap step"},{"line_number":847,"context_line":"            task.node.zap_step \u003d None"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"            _validate_zap_steps(zap_steps)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"            info \u003d task.node.driver_internal_info"},{"line_number":852,"context_line":"            info[\u0027zap_steps\u0027] \u003d zap_steps"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_3e036a75","line":849,"updated":"2015-09-14 16:49:14.000000000","message":"The validate stuff doesn\u0027t require a locked node, so it can be done before locking it.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            # Save the zap steps to the node and reset zap step"},{"line_number":847,"context_line":"            task.node.zap_step \u003d None"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"            _validate_zap_steps(zap_steps)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"            info \u003d task.node.driver_internal_info"},{"line_number":852,"context_line":"            info[\u0027zap_steps\u0027] \u003d zap_steps"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_8d036073","line":849,"in_reply_to":"ba15a1d1_3e036a75","updated":"2015-09-15 00:25:05.000000000","message":"But we pass the node_id, not the actual node object to this function, so this avoids a second lookup.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"173ec9bf457d5e81cced600d1b32bd435cdee895","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            # Save the zap steps to the node and reset zap step"},{"line_number":847,"context_line":"            task.node.zap_step \u003d None"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"            _validate_zap_steps(zap_steps)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"            info \u003d task.node.driver_internal_info"},{"line_number":852,"context_line":"            info[\u0027zap_steps\u0027] \u003d zap_steps"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_abd5c1b9","line":849,"in_reply_to":"ba15a1d1_8d036073","updated":"2015-09-15 19:05:54.000000000","message":"You lost me. _validate_zap_steps() doesn\u0027t use a node id or node object.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            # Save the zap steps to the node and reset zap step"},{"line_number":847,"context_line":"            task.node.zap_step \u003d None"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"            _validate_zap_steps(zap_steps)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"            info \u003d task.node.driver_internal_info"},{"line_number":852,"context_line":"            info[\u0027zap_steps\u0027] \u003d zap_steps"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_6dffb667","line":849,"in_reply_to":"ba15a1d1_abd5c1b9","updated":"2015-09-15 22:44:37.000000000","message":"You are totally right. That\u0027s what I get for trying to get through a review right before heading out for the night ;)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":853,"context_line":"            task.node.driver_internal_info \u003d info"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"            if task.node.provision_state not in ("},{"line_number":856,"context_line":"                    states.MANAGEABLE, states.ZAPFAIL):"},{"line_number":857,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":858,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dtask.node.uuid,"},{"line_number":859,"context_line":"                    state\u003dtask.node.provision_state)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_6fd04e54","line":856,"updated":"2015-09-14 16:51:36.000000000","message":"this check is done inside process_event IIRC, so we just need to catch and reraise state machine exception.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":853,"context_line":"            task.node.driver_internal_info \u003d info"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"            if task.node.provision_state not in ("},{"line_number":856,"context_line":"                    states.MANAGEABLE, states.ZAPFAIL):"},{"line_number":857,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":858,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dtask.node.uuid,"},{"line_number":859,"context_line":"                    state\u003dtask.node.provision_state)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_0d1e70ba","line":856,"in_reply_to":"ba15a1d1_6fd04e54","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":856,"context_line":"                    states.MANAGEABLE, states.ZAPFAIL):"},{"line_number":857,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":858,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dtask.node.uuid,"},{"line_number":859,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":860,"context_line":"            task.process_event(\u0027zap\u0027,"},{"line_number":861,"context_line":"                               callback\u003dself._spawn_worker,"},{"line_number":862,"context_line":"                               call_args\u003d(self._do_node_zap, task,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c82f1ba0","line":859,"updated":"2015-09-14 15:02:13.000000000","message":"Does process_event not handle this for you? :/","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":856,"context_line":"                    states.MANAGEABLE, states.ZAPFAIL):"},{"line_number":857,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":858,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dtask.node.uuid,"},{"line_number":859,"context_line":"                    state\u003dtask.node.provision_state)"},{"line_number":860,"context_line":"            task.process_event(\u0027zap\u0027,"},{"line_number":861,"context_line":"                               callback\u003dself._spawn_worker,"},{"line_number":862,"context_line":"                               call_args\u003d(self._do_node_zap, task,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_6d836ccd","line":859,"in_reply_to":"ba15a1d1_c82f1ba0","updated":"2015-09-15 00:25:05.000000000","message":"Ahh it does. I just need to catch the InvalidState exception and raise InvalidStateException (which seems a bit absurd actually...)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                               callback\u003dself._spawn_worker,"},{"line_number":862,"context_line":"                               call_args\u003d(self._do_node_zap, task,"},{"line_number":863,"context_line":"                                          zap_steps),"},{"line_number":864,"context_line":"                               err_handler\u003dprovisioning_error_handler)"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"    def continue_node_clean(self, context, node_id):"},{"line_number":867,"context_line":"        \"\"\"RPC method to continue cleaning/zapping a node."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_3125dbaa","line":864,"updated":"2015-09-14 16:49:14.000000000","message":"do_node_deploy() has a try/except around this, and reraises exception.InvalidStateRequested instead of InvalidState.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                               callback\u003dself._spawn_worker,"},{"line_number":862,"context_line":"                               call_args\u003d(self._do_node_zap, task,"},{"line_number":863,"context_line":"                                          zap_steps),"},{"line_number":864,"context_line":"                               err_handler\u003dprovisioning_error_handler)"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"    def continue_node_clean(self, context, node_id):"},{"line_number":867,"context_line":"        \"\"\"RPC method to continue cleaning/zapping a node."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_cdf39872","line":864,"in_reply_to":"ba15a1d1_3125dbaa","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":885,"context_line":""},{"line_number":886,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse,"},{"line_number":887,"context_line":"                                  purpose\u003d\u0027node cleaning/zapping\u0027) as task:"},{"line_number":888,"context_line":"            clean \u003d (\u0027clean\u0027 if task.node.provision_state in"},{"line_number":889,"context_line":"                     (states.CLEANING, states.CLEANWAIT) else \u0027zap\u0027)"},{"line_number":890,"context_line":"            # TODO(lucasagomes): CLEANING here for backwards compat"},{"line_number":891,"context_line":"            # with previous code, otherwise nodes in CLEANING when this"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_036974be","line":888,"updated":"2015-09-14 15:02:13.000000000","message":"This variable name could probably be better :) maybe action? clean_action?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":885,"context_line":""},{"line_number":886,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse,"},{"line_number":887,"context_line":"                                  purpose\u003d\u0027node cleaning/zapping\u0027) as task:"},{"line_number":888,"context_line":"            clean \u003d (\u0027clean\u0027 if task.node.provision_state in"},{"line_number":889,"context_line":"                     (states.CLEANING, states.CLEANWAIT) else \u0027zap\u0027)"},{"line_number":890,"context_line":"            # TODO(lucasagomes): CLEANING here for backwards compat"},{"line_number":891,"context_line":"            # with previous code, otherwise nodes in CLEANING when this"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_315ddbe9","line":888,"in_reply_to":"ba15a1d1_036974be","updated":"2015-09-14 16:49:14.000000000","message":"+1 for \u0027action\u0027.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":892,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":893,"context_line":"            # release starts."},{"line_number":894,"context_line":"            if task.node.provision_state not in ("},{"line_number":895,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPPING,"},{"line_number":896,"context_line":"                    states.ZAPWAIT):"},{"line_number":897,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":898,"context_line":"                    \u0027Cannot continue %(clean)s on %(node)s, node is in \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_b1bb2b0e","line":895,"updated":"2015-09-14 16:49:14.000000000","message":"I don\u0027t think you need ZAPPING, if it is similar to CLEANING. (cuz CLEANING is only here for backwards compat.)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":892,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":893,"context_line":"            # release starts."},{"line_number":894,"context_line":"            if task.node.provision_state not in ("},{"line_number":895,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPPING,"},{"line_number":896,"context_line":"                    states.ZAPWAIT):"},{"line_number":897,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":898,"context_line":"                    \u0027Cannot continue %(clean)s on %(node)s, node is in \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_8fd5a244","line":895,"updated":"2015-09-14 16:51:36.000000000","message":"I think we should not allow ZAPPING here. Allowing CLEANING is only for backward compatibility as written above","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":892,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":893,"context_line":"            # release starts."},{"line_number":894,"context_line":"            if task.node.provision_state not in ("},{"line_number":895,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPPING,"},{"line_number":896,"context_line":"                    states.ZAPWAIT):"},{"line_number":897,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":898,"context_line":"                    \u0027Cannot continue %(clean)s on %(node)s, node is in \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_ad31840d","line":895,"in_reply_to":"ba15a1d1_8fd5a244","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":895,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPPING,"},{"line_number":896,"context_line":"                    states.ZAPWAIT):"},{"line_number":897,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":898,"context_line":"                    \u0027Cannot continue %(clean)s on %(node)s, node is in \u0027"},{"line_number":899,"context_line":"                    \u0027%(state)s state, should be %(clean_state)s or \u0027"},{"line_number":900,"context_line":"                    \u0027%(zap_state)s\u0027) %"},{"line_number":901,"context_line":"                    {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_f1f683d6","line":898,"updated":"2015-09-14 16:49:14.000000000","message":"s/%(clean)s/%(clean)sing\u0027","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":895,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPPING,"},{"line_number":896,"context_line":"                    states.ZAPWAIT):"},{"line_number":897,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":898,"context_line":"                    \u0027Cannot continue %(clean)s on %(node)s, node is in \u0027"},{"line_number":899,"context_line":"                    \u0027%(state)s state, should be %(clean_state)s or \u0027"},{"line_number":900,"context_line":"                    \u0027%(zap_state)s\u0027) %"},{"line_number":901,"context_line":"                    {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_50707b72","line":898,"in_reply_to":"ba15a1d1_f1f683d6","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":909,"context_line":"            # TODO(lucasagomes): This conditional is here for backwards"},{"line_number":910,"context_line":"            # compat with previous code. Should be removed once the Mitaka"},{"line_number":911,"context_line":"            # release starts."},{"line_number":912,"context_line":"            if task.node.provision_state in (states.CLEANWAIT, states.ZAPWAIT):"},{"line_number":913,"context_line":"                task.process_event(\u0027resume\u0027)"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"            task.spawn_after("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_2fca56a2","line":912,"updated":"2015-09-14 16:51:36.000000000","message":"if task.node.provision_state !\u003d states.CLEANING:","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":909,"context_line":"            # TODO(lucasagomes): This conditional is here for backwards"},{"line_number":910,"context_line":"            # compat with previous code. Should be removed once the Mitaka"},{"line_number":911,"context_line":"            # release starts."},{"line_number":912,"context_line":"            if task.node.provision_state in (states.CLEANWAIT, states.ZAPWAIT):"},{"line_number":913,"context_line":"                task.process_event(\u0027resume\u0027)"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"            task.spawn_after("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_30faa7be","line":912,"in_reply_to":"ba15a1d1_2fca56a2","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":987,"context_line":"            from the beginning"},{"line_number":988,"context_line":"        \"\"\""},{"line_number":989,"context_line":"        node \u003d task.node"},{"line_number":990,"context_line":"        clean \u003d (\u0027clean\u0027 if task.node.provision_state in"},{"line_number":991,"context_line":"                 (states.CLEANING, states.CLEANWAIT) else \u0027zap\u0027)"},{"line_number":992,"context_line":""},{"line_number":993,"context_line":"        # Trim already executed steps"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_116d3704","line":990,"updated":"2015-09-14 16:49:14.000000000","message":"s/task.node/node/","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":988,"context_line":"        \"\"\""},{"line_number":989,"context_line":"        node \u003d task.node"},{"line_number":990,"context_line":"        clean \u003d (\u0027clean\u0027 if task.node.provision_state in"},{"line_number":991,"context_line":"                 (states.CLEANING, states.CLEANWAIT) else \u0027zap\u0027)"},{"line_number":992,"context_line":""},{"line_number":993,"context_line":"        # Trim already executed steps"},{"line_number":994,"context_line":"        if last_step:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_b1900bee","line":991,"updated":"2015-09-14 16:49:14.000000000","message":"s/clean/action/ or whatever you decided to use","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            # Save which step we\u0027re about to start so we can restart"},{"line_number":1012,"context_line":"            # if necessary"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":"            node.clean_step \u003d step"},{"line_number":1015,"context_line":"            node.save()"},{"line_number":1016,"context_line":"            interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":1017,"context_line":"            LOG.info(_LI(\u0027Executing %(clean)s %(step)s on node %(node)s\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_a363e8b0","line":1014,"updated":"2015-09-14 15:02:13.000000000","message":"If this is triggered by zapping, don\u0027t we want to save this to node.zap_step?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            # Save which step we\u0027re about to start so we can restart"},{"line_number":1012,"context_line":"            # if necessary"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":"            node.clean_step \u003d step"},{"line_number":1015,"context_line":"            node.save()"},{"line_number":1016,"context_line":"            interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":1017,"context_line":"            LOG.info(_LI(\u0027Executing %(clean)s %(step)s on node %(node)s\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_902b7330","line":1014,"in_reply_to":"ba15a1d1_a363e8b0","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"        try:"},{"line_number":1069,"context_line":"            task.driver.deploy.tear_down_cleaning(task)"},{"line_number":1070,"context_line":"        except Exception as e:"},{"line_number":1071,"context_line":"            msg \u003d (_(\u0027Failed to tear down from %(clean) for node %(node)s\u0027)"},{"line_number":1072,"context_line":"                   % {\u0027clean\u0027: clean, \u0027node\u0027: node.uuid})"},{"line_number":1073,"context_line":"            LOG.exception(msg)"},{"line_number":1074,"context_line":"            return cleaning_error_handler(task, msg, tear_down_cleaning\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_946cd59d","line":1071,"updated":"2015-09-14 16:49:14.000000000","message":"s/%(clean)/%(clean)sing/","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"        try:"},{"line_number":1069,"context_line":"            task.driver.deploy.tear_down_cleaning(task)"},{"line_number":1070,"context_line":"        except Exception as e:"},{"line_number":1071,"context_line":"            msg \u003d (_(\u0027Failed to tear down from %(clean) for node %(node)s\u0027)"},{"line_number":1072,"context_line":"                   % {\u0027clean\u0027: clean, \u0027node\u0027: node.uuid})"},{"line_number":1073,"context_line":"            LOG.exception(msg)"},{"line_number":1074,"context_line":"            return cleaning_error_handler(task, msg, tear_down_cleaning\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_08bb880f","line":1071,"in_reply_to":"ba15a1d1_946cd59d","updated":"2015-09-15 22:44:37.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"                                   exception.InvalidParameterValue,"},{"line_number":1113,"context_line":"                                   exception.MissingParameterValue,"},{"line_number":1114,"context_line":"                                   exception.InvalidStateRequested)"},{"line_number":1115,"context_line":"    def do_provisioning_action(self, context, node_id, action, **kwargs):"},{"line_number":1116,"context_line":"        \"\"\"RPC method to initiate certain provisioning state transitions."},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"        Initiate a provisioning state change through the state machine,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_4fcf8ab0","line":1115,"updated":"2015-09-14 16:51:36.000000000","message":"do we really need this change?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"                                   exception.InvalidParameterValue,"},{"line_number":1113,"context_line":"                                   exception.MissingParameterValue,"},{"line_number":1114,"context_line":"                                   exception.InvalidStateRequested)"},{"line_number":1115,"context_line":"    def do_provisioning_action(self, context, node_id, action, **kwargs):"},{"line_number":1116,"context_line":"        \"\"\"RPC method to initiate certain provisioning state transitions."},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"        Initiate a provisioning state change through the state machine,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_43268c69","line":1115,"updated":"2015-09-14 15:02:13.000000000","message":"kwargs doesn\u0027t seem to be used here, unless I\u0027m missing something.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"                                   exception.InvalidParameterValue,"},{"line_number":1113,"context_line":"                                   exception.MissingParameterValue,"},{"line_number":1114,"context_line":"                                   exception.InvalidStateRequested)"},{"line_number":1115,"context_line":"    def do_provisioning_action(self, context, node_id, action, **kwargs):"},{"line_number":1116,"context_line":"        \"\"\"RPC method to initiate certain provisioning state transitions."},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"        Initiate a provisioning state change through the state machine,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_3414e9f3","line":1115,"in_reply_to":"ba15a1d1_43268c69","updated":"2015-09-14 16:49:14.000000000","message":"Why did you change this?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"                                   exception.InvalidParameterValue,"},{"line_number":1113,"context_line":"                                   exception.MissingParameterValue,"},{"line_number":1114,"context_line":"                                   exception.InvalidStateRequested)"},{"line_number":1115,"context_line":"    def do_provisioning_action(self, context, node_id, action, **kwargs):"},{"line_number":1116,"context_line":"        \"\"\"RPC method to initiate certain provisioning state transitions."},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"        Initiate a provisioning state change through the state machine,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_b0d31738","line":1115,"in_reply_to":"ba15a1d1_4fcf8ab0","updated":"2015-09-15 00:25:05.000000000","message":"Ah I was trying to reuse this for zapping, but switched to do_node_zap.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1120,"context_line":""},{"line_number":1121,"context_line":"        :param context: an admin context."},{"line_number":1122,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":1123,"context_line":"        :param action: an action. One of ironic.common.states.VERBS"},{"line_number":1124,"context_line":"        :raises: InvalidParameterValue"},{"line_number":1125,"context_line":"        :raises: InvalidStateRequested"},{"line_number":1126,"context_line":"        :raises: NoFreeConductorWorker"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_430f6ce1","line":1123,"updated":"2015-09-14 15:02:13.000000000","message":"Add kwargs here, if not removing it above.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":2448,"context_line":"    task.process_event(\u0027fail\u0027)"},{"line_number":2449,"context_line":""},{"line_number":2450,"context_line":""},{"line_number":2451,"context_line":"def _prepare_cleaning(task):"},{"line_number":2452,"context_line":"    node \u003d task.node"},{"line_number":2453,"context_line":"    try:"},{"line_number":2454,"context_line":"        # NOTE(ghe): Valid power driver values are needed to perform"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_341149ad","line":2451,"updated":"2015-09-14 16:49:14.000000000","message":"would be nice to have a docstring here, since this is being used for cleaning/zapping. Am wondering if you want to pass an eg \u0027action\u0027 parameter here, with value \u0027zap\u0027 or \u0027clean\u0027.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":2448,"context_line":"    task.process_event(\u0027fail\u0027)"},{"line_number":2449,"context_line":""},{"line_number":2450,"context_line":""},{"line_number":2451,"context_line":"def _prepare_cleaning(task):"},{"line_number":2452,"context_line":"    node \u003d task.node"},{"line_number":2453,"context_line":"    try:"},{"line_number":2454,"context_line":"        # NOTE(ghe): Valid power driver values are needed to perform"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c83b509b","line":2451,"in_reply_to":"ba15a1d1_341149ad","updated":"2015-09-15 22:44:37.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":2457,"context_line":"    except (exception.InvalidParameterValue,"},{"line_number":2458,"context_line":"            exception.MissingParameterValue) as e:"},{"line_number":2459,"context_line":"        msg \u003d (_(\u0027Failed to validate power driver interface. \u0027"},{"line_number":2460,"context_line":"                 \u0027Can not clean node %(node)s. Error: %(msg)s\u0027) %"},{"line_number":2461,"context_line":"               {\u0027node\u0027: node.uuid, \u0027msg\u0027: e})"},{"line_number":2462,"context_line":"        cleaning_error_handler(task, msg)"},{"line_number":2463,"context_line":"        raise exception.NodeCleaningFailure(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_949ff55e","line":2460,"updated":"2015-09-14 16:49:14.000000000","message":"is it \u0027clean\u0027 or \u0027clean or zap\u0027?\n\nWe need a word BLAH that  means \u0027clean or zap\u0027!","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":2457,"context_line":"    except (exception.InvalidParameterValue,"},{"line_number":2458,"context_line":"            exception.MissingParameterValue) as e:"},{"line_number":2459,"context_line":"        msg \u003d (_(\u0027Failed to validate power driver interface. \u0027"},{"line_number":2460,"context_line":"                 \u0027Can not clean node %(node)s. Error: %(msg)s\u0027) %"},{"line_number":2461,"context_line":"               {\u0027node\u0027: node.uuid, \u0027msg\u0027: e})"},{"line_number":2462,"context_line":"        cleaning_error_handler(task, msg)"},{"line_number":2463,"context_line":"        raise exception.NodeCleaningFailure(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_d009eb96","line":2460,"in_reply_to":"ba15a1d1_949ff55e","updated":"2015-09-15 00:25:05.000000000","message":"Ahh missed that one. Thanks!\n\n*cough* we could support only cleaning *cough* :)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":2467,"context_line":"    try:"},{"line_number":2468,"context_line":"        prepare_result \u003d task.driver.deploy.prepare_cleaning(task)"},{"line_number":2469,"context_line":"    except Exception as e:"},{"line_number":2470,"context_line":"        msg \u003d (_(\u0027Failed to prepare node %(node)s for cleaning: %(e)s\u0027)"},{"line_number":2471,"context_line":"               % {\u0027node\u0027: node.uuid, \u0027e\u0027: e})"},{"line_number":2472,"context_line":"        LOG.exception(msg)"},{"line_number":2473,"context_line":"        cleaning_error_handler(task, msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_d4a32d9d","line":2470,"updated":"2015-09-14 16:49:14.000000000","message":"cleaning or zapping!","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":2467,"context_line":"    try:"},{"line_number":2468,"context_line":"        prepare_result \u003d task.driver.deploy.prepare_cleaning(task)"},{"line_number":2469,"context_line":"    except Exception as e:"},{"line_number":2470,"context_line":"        msg \u003d (_(\u0027Failed to prepare node %(node)s for cleaning: %(e)s\u0027)"},{"line_number":2471,"context_line":"               % {\u0027node\u0027: node.uuid, \u0027e\u0027: e})"},{"line_number":2472,"context_line":"        LOG.exception(msg)"},{"line_number":2473,"context_line":"        cleaning_error_handler(task, msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_83ec8fc8","line":2470,"in_reply_to":"ba15a1d1_d4a32d9d","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":2489,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2490,"context_line":"                _(\u0027Zap step requires \"interface\" and \"step\" keys, failing \u0027"},{"line_number":2491,"context_line":"                  \u0027step: %s\u0027) % step)"},{"line_number":2492,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY.keys():"},{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_efc45e93","line":2492,"updated":"2015-09-14 16:51:36.000000000","message":".keys() is not needed","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":2489,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2490,"context_line":"                _(\u0027Zap step requires \"interface\" and \"step\" keys, failing \u0027"},{"line_number":2491,"context_line":"                  \u0027step: %s\u0027) % step)"},{"line_number":2492,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY.keys():"},{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_23d26301","line":2492,"in_reply_to":"ba15a1d1_efc45e93","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":2492,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY.keys():"},{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"},{"line_number":2496,"context_line":"                                 \u0027step\u0027: step})"},{"line_number":2497,"context_line":""},{"line_number":2498,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_0fc2f285","line":2495,"updated":"2015-09-14 16:51:36.000000000","message":"better list(CLEANING_INTERFACE_PRIORITY) to output only keys","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":2492,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY.keys():"},{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"},{"line_number":2496,"context_line":"                                 \u0027step\u0027: step})"},{"line_number":2497,"context_line":""},{"line_number":2498,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_a304337e","line":2495,"in_reply_to":"ba15a1d1_0fc2f285","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"},{"line_number":2496,"context_line":"                                 \u0027step\u0027: step})"},{"line_number":2497,"context_line":""},{"line_number":2498,"context_line":""},{"line_number":2499,"context_line":"def _step_key(step):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_2393585d","line":2496,"updated":"2015-09-14 15:02:13.000000000","message":"Would it be possible/desired to validate these at the API layer, so the user gets immediate feedback on it?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"},{"line_number":2496,"context_line":"                                 \u0027step\u0027: step})"},{"line_number":2497,"context_line":""},{"line_number":2498,"context_line":""},{"line_number":2499,"context_line":"def _step_key(step):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_7eeec223","line":2496,"in_reply_to":"ba15a1d1_2393585d","updated":"2015-09-14 16:49:14.000000000","message":"+1. although you might have to check the CLEANING_INTERFACE_PRIORITY part in the conductor.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"173ec9bf457d5e81cced600d1b32bd435cdee895","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"},{"line_number":2496,"context_line":"                                 \u0027step\u0027: step})"},{"line_number":2497,"context_line":""},{"line_number":2498,"context_line":""},{"line_number":2499,"context_line":"def _step_key(step):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_51b13246","line":2496,"in_reply_to":"ba15a1d1_6335bb44","updated":"2015-09-15 19:05:54.000000000","message":"I took a quick look and I don\u0027t see the API verifying much, so I guess this is OK, as long as it is being checked before an exclusive lock is taken on the node. It means an RPC call but that should be OK (famous last words...)\n\nIt can always be changed later if need be...","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2494,"context_line":"                _(\u0027\"interface\" must be one of %(interfaces)s, failing step: \u0027"},{"line_number":2495,"context_line":"                  \u0027%(step)s\u0027) % {\u0027interfaces\u0027: CLEANING_INTERFACE_PRIORITY,"},{"line_number":2496,"context_line":"                                 \u0027step\u0027: step})"},{"line_number":2497,"context_line":""},{"line_number":2498,"context_line":""},{"line_number":2499,"context_line":"def _step_key(step):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_6335bb44","line":2496,"in_reply_to":"ba15a1d1_7eeec223","updated":"2015-09-15 00:25:05.000000000","message":"As I understand it, because it happens before the task.process_event(\u0027zap\u0027, callback\u003d_spawn_worker ... bit, this will still be validated by the API, however with an call to the conductor. I think it could be moved to the actual API layer, but is that necessary? (I\u0027m fine if the answer is yes!)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"54154081df0b63c82fafdfcd056b9f44c0acaa5c","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027provisioning\u0027),"},{"line_number":857,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            # Save the zap steps to the node and reset zap step"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_0eccf168","line":856,"updated":"2015-09-15 23:42:52.000000000","message":"provisioning?","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e202c4cd1ff11959df14cb716dad77e73cfc2d28","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027provisioning\u0027),"},{"line_number":857,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            # Save the zap steps to the node and reset zap step"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_71f78cf5","line":856,"in_reply_to":"ba15a1d1_0eccf168","updated":"2015-09-16 00:04:20.000000000","message":"Done","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"54154081df0b63c82fafdfcd056b9f44c0acaa5c","unresolved":false,"context_lines":[{"line_number":867,"context_line":"                    states.MANAGEABLE, states.ZAPFAIL):"},{"line_number":868,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":869,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dnode.uuid,"},{"line_number":870,"context_line":"                    state\u003dnode.provision_state)"},{"line_number":871,"context_line":"            try:"},{"line_number":872,"context_line":"                task.process_event(\u0027zap\u0027,"},{"line_number":873,"context_line":"                                   callback\u003dself._spawn_worker,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_cef3599d","line":870,"updated":"2015-09-15 23:42:52.000000000","message":"This block still needs to be dropped, since process_event catches this :)","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e202c4cd1ff11959df14cb716dad77e73cfc2d28","unresolved":false,"context_lines":[{"line_number":867,"context_line":"                    states.MANAGEABLE, states.ZAPFAIL):"},{"line_number":868,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":869,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dnode.uuid,"},{"line_number":870,"context_line":"                    state\u003dnode.provision_state)"},{"line_number":871,"context_line":"            try:"},{"line_number":872,"context_line":"                task.process_event(\u0027zap\u0027,"},{"line_number":873,"context_line":"                                   callback\u003dself._spawn_worker,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_31cb5474","line":870,"in_reply_to":"ba15a1d1_cef3599d","updated":"2015-09-16 00:04:20.000000000","message":"Done","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"54154081df0b63c82fafdfcd056b9f44c0acaa5c","unresolved":false,"context_lines":[{"line_number":906,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":907,"context_line":"            # release starts."},{"line_number":908,"context_line":"            if task.node.provision_state not in ("},{"line_number":909,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPPING,"},{"line_number":910,"context_line":"                    states.ZAPWAIT):"},{"line_number":911,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":912,"context_line":"                    \u0027Cannot continue %(action)sing on %(node)sing, node is in \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_2e23f506","line":909,"updated":"2015-09-15 23:42:52.000000000","message":"Again, no need for zapping here","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e202c4cd1ff11959df14cb716dad77e73cfc2d28","unresolved":false,"context_lines":[{"line_number":906,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":907,"context_line":"            # release starts."},{"line_number":908,"context_line":"            if task.node.provision_state not in ("},{"line_number":909,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPPING,"},{"line_number":910,"context_line":"                    states.ZAPWAIT):"},{"line_number":911,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":912,"context_line":"                    \u0027Cannot continue %(action)sing on %(node)sing, node is in \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_31da7479","line":909,"in_reply_to":"ba15a1d1_2e23f506","updated":"2015-09-16 00:04:20.000000000","message":"Ugh, yeah, missed that. Thanks!","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"54154081df0b63c82fafdfcd056b9f44c0acaa5c","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"            if node.provision_state in (states.CLEANING, states.CLEANWAIT):"},{"line_number":1028,"context_line":"                node.clean_step \u003d step"},{"line_number":1029,"context_line":"            elif node.provision_state in (states.ZAPPING, states.ZAPWAIT):"},{"line_number":1030,"context_line":"                node.zap_step \u003d step"},{"line_number":1031,"context_line":"            node.save()"},{"line_number":1032,"context_line":"            interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":1033,"context_line":"            LOG.info(_LI(\u0027Executing %(action)s %(step)s on node %(node)s\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_6e87add7","line":1030,"updated":"2015-09-15 23:42:52.000000000","message":"Could you use clean_or_zap() for these if statements? (is that useful?)","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e202c4cd1ff11959df14cb716dad77e73cfc2d28","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"            if node.provision_state in (states.CLEANING, states.CLEANWAIT):"},{"line_number":1028,"context_line":"                node.clean_step \u003d step"},{"line_number":1029,"context_line":"            elif node.provision_state in (states.ZAPPING, states.ZAPWAIT):"},{"line_number":1030,"context_line":"                node.zap_step \u003d step"},{"line_number":1031,"context_line":"            node.save()"},{"line_number":1032,"context_line":"            interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":1033,"context_line":"            LOG.info(_LI(\u0027Executing %(action)s %(step)s on node %(node)s\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_b13be49b","line":1030,"in_reply_to":"ba15a1d1_6e87add7","updated":"2015-09-16 00:04:20.000000000","message":"I think I could refactor it to make it work, but I think the simplicity here is worth a bit of extra verbosity.\n\nI don\u0027t think it would hurt to have something like states.CLEANING_STATES/ZAPPING_STATES or something to make these statements less repetitive though.","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"54154081df0b63c82fafdfcd056b9f44c0acaa5c","unresolved":false,"context_lines":[{"line_number":2526,"context_line":"def clean_or_zap(node):"},{"line_number":2527,"context_line":"    \"\"\"Convenience function to make logging cleaning/zapping specific.\"\"\""},{"line_number":2528,"context_line":"    return (\u0027clean\u0027 if node.provision_state in"},{"line_number":2529,"context_line":"            (states.CLEANING, states.CLEANWAIT) else \u0027zap\u0027)"},{"line_number":2530,"context_line":""},{"line_number":2531,"context_line":""},{"line_number":2532,"context_line":"def _step_key(step):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_0e8b91c4","line":2529,"updated":"2015-09-15 23:42:52.000000000","message":"I wonder if we should return None here, if it isn\u0027t in CLEAN* or ZAP*?\n\nI also wonder if it should be a utils method... not too opinionated, though.","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e202c4cd1ff11959df14cb716dad77e73cfc2d28","unresolved":false,"context_lines":[{"line_number":2526,"context_line":"def clean_or_zap(node):"},{"line_number":2527,"context_line":"    \"\"\"Convenience function to make logging cleaning/zapping specific.\"\"\""},{"line_number":2528,"context_line":"    return (\u0027clean\u0027 if node.provision_state in"},{"line_number":2529,"context_line":"            (states.CLEANING, states.CLEANWAIT) else \u0027zap\u0027)"},{"line_number":2530,"context_line":""},{"line_number":2531,"context_line":""},{"line_number":2532,"context_line":"def _step_key(step):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_71a9ccde","line":2529,"in_reply_to":"ba15a1d1_0e8b91c4","updated":"2015-09-16 00:04:20.000000000","message":"Alrighty!\n\nHonestly, the whole bottom 100 or so lines of this file could go to a cleaning.py or something.","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":834,"context_line":"                                   exception.NodeLocked,"},{"line_number":835,"context_line":"                                   exception.NodeInMaintenance,"},{"line_number":836,"context_line":"                                   exception.InvalidStateRequested)"},{"line_number":837,"context_line":"    def do_node_zap(self, context, node_id, zap_steps):"},{"line_number":838,"context_line":"        \"\"\"RPC method to initiate zapping."},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"        :param context: an admin context."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_18ac2cec","line":837,"updated":"2015-09-16 07:50:53.000000000","message":"Need to add InvalidParameterValue here.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":834,"context_line":"                                   exception.NodeLocked,"},{"line_number":835,"context_line":"                                   exception.NodeInMaintenance,"},{"line_number":836,"context_line":"                                   exception.InvalidStateRequested)"},{"line_number":837,"context_line":"    def do_node_zap(self, context, node_id, zap_steps):"},{"line_number":838,"context_line":"        \"\"\"RPC method to initiate zapping."},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"        :param context: an admin context."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_b5df250c","line":837,"in_reply_to":"ba15a1d1_18ac2cec","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":841,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":842,"context_line":"        :param zap_steps: the list of zap step dictionaries to perform on the"},{"line_number":843,"context_line":"            node, in the format [{\u0027step\u0027: \u0027upgrade_firmware\u0027,"},{"line_number":844,"context_line":"            \u0027interface\u0027: deploy\u0027}, ...]"},{"line_number":845,"context_line":"        :raises: InvalidParameterValue"},{"line_number":846,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":847,"context_line":"            zapfail state"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_a3c93a28","line":844,"updated":"2015-09-16 17:25:03.000000000","message":"let\u0027s be more explicit here cuz I want to make sure I understand. \u0027required_args\u0027 is optional, right? but \u0027step\u0027, \u0027interface\u0027 must be specified. \n\nAnd I\u0027m not sure about \u0027priority\u0027 or \u0027cleaning_priority\u0027, which one is right, and whether it is needed/optional/not used.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":841,"context_line":"        :param node_id: the id or uuid of a node."},{"line_number":842,"context_line":"        :param zap_steps: the list of zap step dictionaries to perform on the"},{"line_number":843,"context_line":"            node, in the format [{\u0027step\u0027: \u0027upgrade_firmware\u0027,"},{"line_number":844,"context_line":"            \u0027interface\u0027: deploy\u0027}, ...]"},{"line_number":845,"context_line":"        :raises: InvalidParameterValue"},{"line_number":846,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":847,"context_line":"            zapfail state"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_90b9cf7b","line":844,"in_reply_to":"ba15a1d1_a3c93a28","updated":"2015-09-16 22:00:37.000000000","message":"Alright! Yes, required_args is optional. I think I\u0027ll move using those to a new patch, as this one is already quite large. \n\npriority is only shown when listing steps. priority is implicit in the ordering of the steps for zapping.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":842,"context_line":"        :param zap_steps: the list of zap step dictionaries to perform on the"},{"line_number":843,"context_line":"            node, in the format [{\u0027step\u0027: \u0027upgrade_firmware\u0027,"},{"line_number":844,"context_line":"            \u0027interface\u0027: deploy\u0027}, ...]"},{"line_number":845,"context_line":"        :raises: InvalidParameterValue"},{"line_number":846,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":847,"context_line":"            zapfail state"},{"line_number":848,"context_line":"        :raises: NoFreeConductorWorker"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_b8bae021","line":845,"updated":"2015-09-16 07:50:53.000000000","message":"may be\n\n  :raises: InvalidParameterValue, if validation of zap step fails.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":842,"context_line":"        :param zap_steps: the list of zap step dictionaries to perform on the"},{"line_number":843,"context_line":"            node, in the format [{\u0027step\u0027: \u0027upgrade_firmware\u0027,"},{"line_number":844,"context_line":"            \u0027interface\u0027: deploy\u0027}, ...]"},{"line_number":845,"context_line":"        :raises: InvalidParameterValue"},{"line_number":846,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":847,"context_line":"            zapfail state"},{"line_number":848,"context_line":"        :raises: NoFreeConductorWorker"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_55d1e9f8","line":845,"in_reply_to":"ba15a1d1_b8bae021","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        :raises: InvalidParameterValue"},{"line_number":846,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":847,"context_line":"            zapfail state"},{"line_number":848,"context_line":"        :raises: NoFreeConductorWorker"},{"line_number":849,"context_line":"        \"\"\""},{"line_number":850,"context_line":"        _validate_zap_steps(zap_steps)"},{"line_number":851,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_387d706e","line":848,"updated":"2015-09-16 07:50:53.000000000","message":"Missing exception.NodeInMaintenance","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        :raises: InvalidParameterValue"},{"line_number":846,"context_line":"        :raises: InvalidStateRequested if the node is not in manageable or"},{"line_number":847,"context_line":"            zapfail state"},{"line_number":848,"context_line":"        :raises: NoFreeConductorWorker"},{"line_number":849,"context_line":"        \"\"\""},{"line_number":850,"context_line":"        _validate_zap_steps(zap_steps)"},{"line_number":851,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_f5d91d23","line":848,"in_reply_to":"ba15a1d1_387d706e","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        _validate_zap_steps(zap_steps)"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse,"},{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027zapping\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_b85660d0","line":853,"updated":"2015-09-16 07:50:53.000000000","message":"s/node zap/node zapping to be consistent.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        _validate_zap_steps(zap_steps)"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dFalse,"},{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027zapping\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_f5f03d93","line":853,"in_reply_to":"ba15a1d1_b85660d0","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027zapping\u0027),"},{"line_number":857,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            # Save the zap steps to the node and reset zap step"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_0b6ff892","line":856,"updated":"2015-09-16 07:50:53.000000000","message":"Missing test case for this path.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027zapping\u0027),"},{"line_number":857,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            # Save the zap steps to the node and reset zap step"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_6e29c936","line":856,"updated":"2015-09-16 17:25:03.000000000","message":"wondering if there might be a case where someone wants to zap (ie, select some clean step(s)) if the node is in maintenance.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027zapping\u0027),"},{"line_number":857,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            # Save the zap steps to the node and reset zap step"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_3528f599","line":856,"in_reply_to":"ba15a1d1_0b6ff892","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                  purpose\u003d\u0027node zap\u0027) as task:"},{"line_number":854,"context_line":"            node \u003d task.node"},{"line_number":855,"context_line":"            if node.maintenance:"},{"line_number":856,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027zapping\u0027),"},{"line_number":857,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            # Save the zap steps to the node and reset zap step"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_7542ed69","line":856,"in_reply_to":"ba15a1d1_6e29c936","updated":"2015-09-16 22:00:37.000000000","message":"I don\u0027t think we should allow it, because I\u0027d rather prevent someone accidentally zapping a node that was maintenanced for some unknown (to us) reason that shouldn\u0027t allow zapping.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":870,"context_line":"                                              zap_steps),"},{"line_number":871,"context_line":"                                   err_handler\u003dprovisioning_error_handler)"},{"line_number":872,"context_line":"            except exception.InvalidState:"},{"line_number":873,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":874,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dnode.uuid,"},{"line_number":875,"context_line":"                    state\u003dnode.provision_state)"},{"line_number":876,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_4b13b00d","line":873,"updated":"2015-09-16 07:50:53.000000000","message":"Missing test case for this path.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":870,"context_line":"                                              zap_steps),"},{"line_number":871,"context_line":"                                   err_handler\u003dprovisioning_error_handler)"},{"line_number":872,"context_line":"            except exception.InvalidState:"},{"line_number":873,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":874,"context_line":"                    action\u003d\u0027zap\u0027, node\u003dnode.uuid,"},{"line_number":875,"context_line":"                    state\u003dnode.provision_state)"},{"line_number":876,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_55b0098a","line":873,"in_reply_to":"ba15a1d1_4b13b00d","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":903,"context_line":"            if task.node.provision_state not in ("},{"line_number":904,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPWAIT):"},{"line_number":905,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":906,"context_line":"                    \u0027Cannot continue %(action)sing on %(node)sing, node is in \u0027"},{"line_number":907,"context_line":"                    \u0027%(state)s state, should be %(clean_state)s or \u0027"},{"line_number":908,"context_line":"                    \u0027%(zap_state)s\u0027) %"},{"line_number":909,"context_line":"                    {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_38101001","line":906,"updated":"2015-09-16 07:50:53.000000000","message":"s/%(node)sing/%(node)s","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":903,"context_line":"            if task.node.provision_state not in ("},{"line_number":904,"context_line":"                    states.CLEANWAIT, states.CLEANING, states.ZAPWAIT):"},{"line_number":905,"context_line":"                raise exception.InvalidStateRequested(_("},{"line_number":906,"context_line":"                    \u0027Cannot continue %(action)sing on %(node)sing, node is in \u0027"},{"line_number":907,"context_line":"                    \u0027%(state)s state, should be %(clean_state)s or \u0027"},{"line_number":908,"context_line":"                    \u0027%(zap_state)s\u0027) %"},{"line_number":909,"context_line":"                    {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_f504bd18","line":906,"in_reply_to":"ba15a1d1_38101001","updated":"2015-09-16 22:00:37.000000000","message":"lol whoops.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":918,"context_line":"            # TODO(lucasagomes): This conditional is here for backwards"},{"line_number":919,"context_line":"            # compat with previous code. Should be removed once the Mitaka"},{"line_number":920,"context_line":"            # release starts."},{"line_number":921,"context_line":"            if task.node.provision_state \u003d\u003d states.CLEANWAIT:"},{"line_number":922,"context_line":"                task.process_event(\u0027resume\u0027)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"            task.spawn_after("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_18f50c82","line":921,"updated":"2015-09-16 07:50:53.000000000","message":"Shouldn\u0027t we have ZAPWAIT here as well","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":918,"context_line":"            # TODO(lucasagomes): This conditional is here for backwards"},{"line_number":919,"context_line":"            # compat with previous code. Should be removed once the Mitaka"},{"line_number":920,"context_line":"            # release starts."},{"line_number":921,"context_line":"            if task.node.provision_state \u003d\u003d states.CLEANWAIT:"},{"line_number":922,"context_line":"                task.process_event(\u0027resume\u0027)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"            task.spawn_after("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_0ee04d28","line":921,"in_reply_to":"ba15a1d1_08f92cc7","updated":"2015-09-16 17:25:03.000000000","message":"I think the \u0027problem\u0027 is that the TODO isn\u0027t that clear. Or it is clear if you read it. The CONDITIONAL is there for backwards compat -- we\u0027d just remove the \u0027if\u0027 part later. We need to do a task.process_event(\u0027resume\u0027) cuz the node is in states.ZAPWAIT.\n\nSo I think what Dmitry mentioned may be cleaner (ugh): if task.node.provision_state !\u003d states.CLEANING:...\ncuz we want the state to go to CLEANING or ZAPPING now.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":918,"context_line":"            # TODO(lucasagomes): This conditional is here for backwards"},{"line_number":919,"context_line":"            # compat with previous code. Should be removed once the Mitaka"},{"line_number":920,"context_line":"            # release starts."},{"line_number":921,"context_line":"            if task.node.provision_state \u003d\u003d states.CLEANWAIT:"},{"line_number":922,"context_line":"                task.process_event(\u0027resume\u0027)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"            task.spawn_after("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_701e7b60","line":921,"in_reply_to":"ba15a1d1_0ee04d28","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b7625ac57adff1188d8bbc5fa03e458e55036b35","unresolved":false,"context_lines":[{"line_number":918,"context_line":"            # TODO(lucasagomes): This conditional is here for backwards"},{"line_number":919,"context_line":"            # compat with previous code. Should be removed once the Mitaka"},{"line_number":920,"context_line":"            # release starts."},{"line_number":921,"context_line":"            if task.node.provision_state \u003d\u003d states.CLEANWAIT:"},{"line_number":922,"context_line":"                task.process_event(\u0027resume\u0027)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"            task.spawn_after("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_c5b47d36","line":921,"in_reply_to":"ba15a1d1_18f50c82","updated":"2015-09-16 13:55:26.000000000","message":"No, the CLEANWAIT here is for backwards compat; no need for ZAPWAIT","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"414ec92aed7bdf651be9c5e62dd5fb8a36eebbb8","unresolved":false,"context_lines":[{"line_number":918,"context_line":"            # TODO(lucasagomes): This conditional is here for backwards"},{"line_number":919,"context_line":"            # compat with previous code. Should be removed once the Mitaka"},{"line_number":920,"context_line":"            # release starts."},{"line_number":921,"context_line":"            if task.node.provision_state \u003d\u003d states.CLEANWAIT:"},{"line_number":922,"context_line":"                task.process_event(\u0027resume\u0027)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"            task.spawn_after("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_08f92cc7","line":921,"in_reply_to":"ba15a1d1_c5b47d36","updated":"2015-09-16 14:20:38.000000000","message":"I think it should still be there.  Zap tasks are put in ZAPWAIT when something is happening on the node inband and we have to do a resume to make it back to ZAPPING. Right ?","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":962,"context_line":"            node.driver_internal_info.get(\u0027clean_steps\u0027, []),"},{"line_number":963,"context_line":"            node.clean_step)"},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"    def _do_node_zap(self, task):"},{"line_number":966,"context_line":"        \"\"\"Internal RPC method to perform zapping on a node.\"\"\""},{"line_number":967,"context_line":"        node \u003d task.node"},{"line_number":968,"context_line":"        LOG.debug(\u0027Starting zapping for node %s\u0027, node.uuid)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_18c74c46","line":965,"updated":"2015-09-16 07:50:53.000000000","message":"Still lot of common code between _do_node_clean and _do_node_zap. Can we just merge it into a common function.  I think only difference is \n\n  node.driver_internal_info.get(\u0027clean_steps\u0027, [])\nOR\n  node.driver_internal_info.get(\u0027zap_steps\u0027, [])","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":962,"context_line":"            node.driver_internal_info.get(\u0027clean_steps\u0027, []),"},{"line_number":963,"context_line":"            node.clean_step)"},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"    def _do_node_zap(self, task):"},{"line_number":966,"context_line":"        \"\"\"Internal RPC method to perform zapping on a node.\"\"\""},{"line_number":967,"context_line":"        node \u003d task.node"},{"line_number":968,"context_line":"        LOG.debug(\u0027Starting zapping for node %s\u0027, node.uuid)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_90a8efdc","line":965,"in_reply_to":"ba15a1d1_18c74c46","updated":"2015-09-16 22:00:37.000000000","message":"Also the check for \u0027if not CONF.conductor.clean_nodes:\u0027 and \u0027set_node_cleaning_steps(task)\u0027. That\u0027s enough that I\u0027m comfortable leaving them separate.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"                node.zap_step \u003d step"},{"line_number":1024,"context_line":"            node.save()"},{"line_number":1025,"context_line":"            interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":1026,"context_line":"            LOG.info(_LI(\u0027Executing %(action)s %(step)s on node %(node)s\u0027),"},{"line_number":1027,"context_line":"                     {\u0027action\u0027: clean_or_zap(node), \u0027step\u0027: step,"},{"line_number":1028,"context_line":"                      \u0027node\u0027: node.uuid})"},{"line_number":1029,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_b8c5003d","line":1026,"updated":"2015-09-16 07:50:53.000000000","message":"s/Executing %(action)s /Executing %(action)s step/","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"                node.zap_step \u003d step"},{"line_number":1024,"context_line":"            node.save()"},{"line_number":1025,"context_line":"            interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":1026,"context_line":"            LOG.info(_LI(\u0027Executing %(action)s %(step)s on node %(node)s\u0027),"},{"line_number":1027,"context_line":"                     {\u0027action\u0027: clean_or_zap(node), \u0027step\u0027: step,"},{"line_number":1028,"context_line":"                      \u0027node\u0027: node.uuid})"},{"line_number":1029,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_10e37f34","line":1026,"in_reply_to":"ba15a1d1_b8c5003d","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                     {\u0027action\u0027: clean_or_zap(node), \u0027step\u0027: step,"},{"line_number":1028,"context_line":"                      \u0027node\u0027: node.uuid})"},{"line_number":1029,"context_line":"            try:"},{"line_number":1030,"context_line":"                result \u003d interface.execute_clean_step(task, step)"},{"line_number":1031,"context_line":"            except Exception as e:"},{"line_number":1032,"context_line":"                msg \u003d (_(\u0027Node %(node)s failed %(action)sing step %(step)s: \u0027"},{"line_number":1033,"context_line":"                         \u0027%(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_18866cb9","line":1030,"updated":"2015-09-16 07:50:53.000000000","message":"I think we were of the assumption in cleaning that the clean step was indeed correct.  But now, since this is a user-provided thing, the base driver implementation of execute_clean_step will throw TypeError trying to make a call on None. I think we will need to handle this somewhere.  Probably a new exception can be raised in base implementation.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                     {\u0027action\u0027: clean_or_zap(node), \u0027step\u0027: step,"},{"line_number":1028,"context_line":"                      \u0027node\u0027: node.uuid})"},{"line_number":1029,"context_line":"            try:"},{"line_number":1030,"context_line":"                result \u003d interface.execute_clean_step(task, step)"},{"line_number":1031,"context_line":"            except Exception as e:"},{"line_number":1032,"context_line":"                msg \u003d (_(\u0027Node %(node)s failed %(action)sing step %(step)s: \u0027"},{"line_number":1033,"context_line":"                         \u0027%(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_cb9c7c11","line":1030,"in_reply_to":"ba15a1d1_08204c47","updated":"2015-09-16 22:00:37.000000000","message":"Alright, but this will work as is (exception is still caught and message will contain the correct info). I\u0027ll make it a nicer exception in a followup.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b7625ac57adff1188d8bbc5fa03e458e55036b35","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                     {\u0027action\u0027: clean_or_zap(node), \u0027step\u0027: step,"},{"line_number":1028,"context_line":"                      \u0027node\u0027: node.uuid})"},{"line_number":1029,"context_line":"            try:"},{"line_number":1030,"context_line":"                result \u003d interface.execute_clean_step(task, step)"},{"line_number":1031,"context_line":"            except Exception as e:"},{"line_number":1032,"context_line":"                msg \u003d (_(\u0027Node %(node)s failed %(action)sing step %(step)s: \u0027"},{"line_number":1033,"context_line":"                         \u0027%(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_85d7654a","line":1030,"in_reply_to":"ba15a1d1_18866cb9","updated":"2015-09-16 13:55:26.000000000","message":"We validate the interface before this.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"414ec92aed7bdf651be9c5e62dd5fb8a36eebbb8","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                     {\u0027action\u0027: clean_or_zap(node), \u0027step\u0027: step,"},{"line_number":1028,"context_line":"                      \u0027node\u0027: node.uuid})"},{"line_number":1029,"context_line":"            try:"},{"line_number":1030,"context_line":"                result \u003d interface.execute_clean_step(task, step)"},{"line_number":1031,"context_line":"            except Exception as e:"},{"line_number":1032,"context_line":"                msg \u003d (_(\u0027Node %(node)s failed %(action)sing step %(step)s: \u0027"},{"line_number":1033,"context_line":"                         \u0027%(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_08204c47","line":1030,"in_reply_to":"ba15a1d1_85d7654a","updated":"2015-09-16 14:20:38.000000000","message":"We validate the interfaces before, but we don\u0027t validate whether the clean step requested exists or not.  What if someone made a type while mentioning the \u0027step\u0027 key (not the \u0027interface\u0027 key)?","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"            LOG.info(_LI(\u0027Node %(node)s finished clean step %(step)s\u0027),"},{"line_number":1067,"context_line":"                     {\u0027node\u0027: node.uuid, \u0027step\u0027: step})"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"        # Clear clean/zap_step"},{"line_number":1070,"context_line":"        driver_internal_info \u003d node.driver_internal_info"},{"line_number":1071,"context_line":"        if node.provision_state in (states.CLEANING, states.CLEANWAIT):"},{"line_number":1072,"context_line":"            node.clean_step \u003d {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_78de8812","line":1069,"updated":"2015-09-16 07:50:53.000000000","message":"s/clean/clean_step","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"            LOG.info(_LI(\u0027Node %(node)s finished clean step %(step)s\u0027),"},{"line_number":1067,"context_line":"                     {\u0027node\u0027: node.uuid, \u0027step\u0027: step})"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"        # Clear clean/zap_step"},{"line_number":1070,"context_line":"        driver_internal_info \u003d node.driver_internal_info"},{"line_number":1071,"context_line":"        if node.provision_state in (states.CLEANING, states.CLEANWAIT):"},{"line_number":1072,"context_line":"            node.clean_step \u003d {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8b0c443c","line":1069,"in_reply_to":"ba15a1d1_78de8812","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":2464,"context_line":"    Validates that we can control the power interface for the node, and, if"},{"line_number":2465,"context_line":"    using an agent driver, boots the agent so we can get a list of steps from"},{"line_number":2466,"context_line":"    it."},{"line_number":2467,"context_line":""},{"line_number":2468,"context_line":"    :raises: NodeCleaningFailure if cleaning cannot be prepared either due to"},{"line_number":2469,"context_line":"        the power interface"},{"line_number":2470,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_3827b065","line":2467,"updated":"2015-09-16 07:50:53.000000000","message":"Since we have a proper doc string, may be add :param: and :returns: too.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":2464,"context_line":"    Validates that we can control the power interface for the node, and, if"},{"line_number":2465,"context_line":"    using an agent driver, boots the agent so we can get a list of steps from"},{"line_number":2466,"context_line":"    it."},{"line_number":2467,"context_line":""},{"line_number":2468,"context_line":"    :raises: NodeCleaningFailure if cleaning cannot be prepared either due to"},{"line_number":2469,"context_line":"        the power interface"},{"line_number":2470,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_d00c27ef","line":2467,"in_reply_to":"ba15a1d1_3827b065","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":2503,"context_line":""},{"line_number":2504,"context_line":"def _validate_zap_steps(zap_steps):"},{"line_number":2505,"context_line":"    \"\"\"Ensure all necessary keys are present and correct in zap steps\"\"\""},{"line_number":2506,"context_line":"    for step in zap_steps:"},{"line_number":2507,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2508,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2509,"context_line":"                _(\u0027Zap step requires \"interface\" and \"step\" keys, failing \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_386fb0c6","line":2506,"updated":"2015-09-16 07:50:53.000000000","message":"Can we accumulate all the errors and raise one exception. I think it will be useful to the operator if there are multiple mistakes.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08666920502f209b81fd54a1b30a12834825093f","unresolved":false,"context_lines":[{"line_number":2503,"context_line":""},{"line_number":2504,"context_line":"def _validate_zap_steps(zap_steps):"},{"line_number":2505,"context_line":"    \"\"\"Ensure all necessary keys are present and correct in zap steps\"\"\""},{"line_number":2506,"context_line":"    for step in zap_steps:"},{"line_number":2507,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2508,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2509,"context_line":"                _(\u0027Zap step requires \"interface\" and \"step\" keys, failing \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8818e71f","line":2506,"updated":"2015-09-16 10:17:45.000000000","message":"IIUC not code current checks type of zap_steps. must be checked here or on API level. also I don\u0027t see where you convert text to JSON, but maybe I\u0027m just blind :)","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":2503,"context_line":""},{"line_number":2504,"context_line":"def _validate_zap_steps(zap_steps):"},{"line_number":2505,"context_line":"    \"\"\"Ensure all necessary keys are present and correct in zap steps\"\"\""},{"line_number":2506,"context_line":"    for step in zap_steps:"},{"line_number":2507,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2508,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2509,"context_line":"                _(\u0027Zap step requires \"interface\" and \"step\" keys, failing \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_eb6aa080","line":2506,"in_reply_to":"ba15a1d1_386fb0c6","updated":"2015-09-16 22:00:37.000000000","message":"Sure.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":2503,"context_line":""},{"line_number":2504,"context_line":"def _validate_zap_steps(zap_steps):"},{"line_number":2505,"context_line":"    \"\"\"Ensure all necessary keys are present and correct in zap steps\"\"\""},{"line_number":2506,"context_line":"    for step in zap_steps:"},{"line_number":2507,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2508,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":2509,"context_line":"                _(\u0027Zap step requires \"interface\" and \"step\" keys, failing \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_2b9978c4","line":2506,"in_reply_to":"ba15a1d1_8818e71f","updated":"2015-09-16 22:00:37.000000000","message":"I\u0027m fairly confident that\u0027s converted if we change the expected type to types.JSON in the API layer.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"dc3520e60f4e6a6a513f2678109963bb7f63de6e","unresolved":false,"context_lines":[{"line_number":866,"context_line":""},{"line_number":867,"context_line":"            info \u003d node.driver_internal_info"},{"line_number":868,"context_line":"            info[\u0027zap_steps\u0027] \u003d zap_steps"},{"line_number":869,"context_line":"            node.driver_internal_info \u003d info"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"            try:"},{"line_number":872,"context_line":"                task.process_event(\u0027zap\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_307bf5c2","line":869,"updated":"2015-09-17 16:40:06.000000000","message":"I think we need a node.save() here :)","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"827f3ca57324bb666a99610d2b8a7fe6dfe01b05","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                task.process_event(\u0027zap\u0027,"},{"line_number":873,"context_line":"                                   callback\u003dself._spawn_worker,"},{"line_number":874,"context_line":"                                   call_args\u003d(self._do_node_zap, task,"},{"line_number":875,"context_line":"                                              zap_steps),"},{"line_number":876,"context_line":"                                   err_handler\u003dprovisioning_error_handler)"},{"line_number":877,"context_line":"            except exception.InvalidState:"},{"line_number":878,"context_line":"                raise exception.InvalidStateRequested("}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_2db4027e","line":875,"updated":"2015-09-17 16:10:55.000000000","message":"You\u0027re passing zap_steps in here, but the method doesn\u0027t take that argument.","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"dc3520e60f4e6a6a513f2678109963bb7f63de6e","unresolved":false,"context_lines":[{"line_number":930,"context_line":"                self._spawn_worker,"},{"line_number":931,"context_line":"                self._do_next_clean_step,"},{"line_number":932,"context_line":"                task,"},{"line_number":933,"context_line":"                task.node.driver_internal_info.get(\u0027clean_steps\u0027, []),"},{"line_number":934,"context_line":"                task.node.clean_step)"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"    def _do_node_clean(self, task):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_06e79b40","line":933,"updated":"2015-09-17 16:40:06.000000000","message":"Going to need zap_steps here for zapping","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"67c4acdfd1a9dde6bb6c3cc7d93a46968188c469","unresolved":false,"context_lines":[{"line_number":978,"context_line":"            # Exception handling is done in _prepare_cleaning"},{"line_number":979,"context_line":"            return"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        if prepare_result \u003d\u003d states.CLEANWAIT:"},{"line_number":982,"context_line":"            # Prepare is asynchronous, the deploy driver will need to"},{"line_number":983,"context_line":"            # set node.driver_internal_info[\u0027zap_steps\u0027] and"},{"line_number":984,"context_line":"            # node.zap_step and then make an RPC call to"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_5ae6ca15","line":981,"updated":"2015-09-17 15:50:26.000000000","message":"ZAPWAIT?","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f5944ac4b4ec82897e292b4221541d1c25f51b44","unresolved":false,"context_lines":[{"line_number":978,"context_line":"            # Exception handling is done in _prepare_cleaning"},{"line_number":979,"context_line":"            return"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        if prepare_result \u003d\u003d states.CLEANWAIT:"},{"line_number":982,"context_line":"            # Prepare is asynchronous, the deploy driver will need to"},{"line_number":983,"context_line":"            # set node.driver_internal_info[\u0027zap_steps\u0027] and"},{"line_number":984,"context_line":"            # node.zap_step and then make an RPC call to"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_2bdce344","line":981,"in_reply_to":"ba15a1d1_5ae6ca15","updated":"2015-09-17 20:13:38.000000000","message":"probably warrants a comment. This is CLEANWAIT cuz _prepare_cleaning returns CLEANWAIT, not ZAPWAIT.","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":2515,"context_line":"    \"\"\"Ensure all necessary keys are present and correct in zap steps\"\"\""},{"line_number":2516,"context_line":"    if not isinstance(zap_steps, list):"},{"line_number":2517,"context_line":"        raise exception.InvalidParameterValue(_(\u0027zap_steps must be a list of\u0027"},{"line_number":2518,"context_line":"                                                \u0027zap step dictionaries.\u0027))"},{"line_number":2519,"context_line":""},{"line_number":2520,"context_line":"    errors \u003d []"},{"line_number":2521,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_304a2027","line":2518,"updated":"2015-09-17 15:05:51.000000000","message":"missing a blank space between \u0027ofzap\u0027","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"827f3ca57324bb666a99610d2b8a7fe6dfe01b05","unresolved":false,"context_lines":[{"line_number":2519,"context_line":""},{"line_number":2520,"context_line":"    errors \u003d []"},{"line_number":2521,"context_line":""},{"line_number":2522,"context_line":"    for step in zap_steps:"},{"line_number":2523,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2524,"context_line":"            errors.append(_(\u0027Zap step requires \"interface\" and \"step\" keys, \u0027"},{"line_number":2525,"context_line":"                            \u0027failing step: %s\u0027) % step)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_6d82fac9","line":2522,"updated":"2015-09-17 16:10:55.000000000","message":"Let\u0027s ensure step is a dict, before going any further, it gets weird if you submit zap_steps\u003d[\"interface\"] for example","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":2522,"context_line":"    for step in zap_steps:"},{"line_number":2523,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2524,"context_line":"            errors.append(_(\u0027Zap step requires \"interface\" and \"step\" keys, \u0027"},{"line_number":2525,"context_line":"                            \u0027failing step: %s\u0027) % step)"},{"line_number":2526,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY:"},{"line_number":2527,"context_line":"            errors.append(_(\u0027\"interface\" must be one of %(interfaces)s, \u0027"},{"line_number":2528,"context_line":"                            \u0027failing step: %(step)s\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_73598234","line":2525,"updated":"2015-09-17 15:05:51.000000000","message":"For the user\u0027s sake, I think we should separate these two so we can clearly identify what is missing. Eg:\n\n  missing \u003d [key for key in (\u0027interface\u0027, \u0027step\u0027) if k not in step\n  if missing:\n    errors.append(_(Zap step \"%(step)s\" is missing these keys: %(missing)s\" % {\u0027step\u0027:step, \u0027missing\u0027:\u0027 and \u0027.join(missing)}","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":2523,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2524,"context_line":"            errors.append(_(\u0027Zap step requires \"interface\" and \"step\" keys, \u0027"},{"line_number":2525,"context_line":"                            \u0027failing step: %s\u0027) % step)"},{"line_number":2526,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY:"},{"line_number":2527,"context_line":"            errors.append(_(\u0027\"interface\" must be one of %(interfaces)s, \u0027"},{"line_number":2528,"context_line":"                            \u0027failing step: %(step)s\u0027)"},{"line_number":2529,"context_line":"                          % {\u0027interfaces\u0027: list(CLEANING_INTERFACE_PRIORITY),"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_b3187ad4","line":2526,"updated":"2015-09-17 15:05:51.000000000","message":"step[\u0027interface\u0027] might not exist. You check it above but you still continue to this line.","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"827f3ca57324bb666a99610d2b8a7fe6dfe01b05","unresolved":false,"context_lines":[{"line_number":2523,"context_line":"        if \u0027interface\u0027 not in step or \u0027step\u0027 not in step:"},{"line_number":2524,"context_line":"            errors.append(_(\u0027Zap step requires \"interface\" and \"step\" keys, \u0027"},{"line_number":2525,"context_line":"                            \u0027failing step: %s\u0027) % step)"},{"line_number":2526,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY:"},{"line_number":2527,"context_line":"            errors.append(_(\u0027\"interface\" must be one of %(interfaces)s, \u0027"},{"line_number":2528,"context_line":"                            \u0027failing step: %(step)s\u0027)"},{"line_number":2529,"context_line":"                          % {\u0027interfaces\u0027: list(CLEANING_INTERFACE_PRIORITY),"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_cd31c65b","line":2526,"in_reply_to":"ba15a1d1_b3187ad4","updated":"2015-09-17 16:10:55.000000000","message":"+1, just hit this in devstack with zap_steps\u003d[{}]","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":2525,"context_line":"                            \u0027failing step: %s\u0027) % step)"},{"line_number":2526,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY:"},{"line_number":2527,"context_line":"            errors.append(_(\u0027\"interface\" must be one of %(interfaces)s, \u0027"},{"line_number":2528,"context_line":"                            \u0027failing step: %(step)s\u0027)"},{"line_number":2529,"context_line":"                          % {\u0027interfaces\u0027: list(CLEANING_INTERFACE_PRIORITY),"},{"line_number":2530,"context_line":"                             \u0027step\u0027: step})"},{"line_number":2531,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_b33dda90","line":2528,"updated":"2015-09-17 15:05:51.000000000","message":"Maybe something like \u0027For zap step \"%(step)s\", \"interface\" must be one of ...\n\n(I\u0027m not fond of \u0027failing step\u0027.)","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"67c4acdfd1a9dde6bb6c3cc7d93a46968188c469","unresolved":false,"context_lines":[{"line_number":2525,"context_line":"                            \u0027failing step: %s\u0027) % step)"},{"line_number":2526,"context_line":"        if step[\u0027interface\u0027] not in CLEANING_INTERFACE_PRIORITY:"},{"line_number":2527,"context_line":"            errors.append(_(\u0027\"interface\" must be one of %(interfaces)s, \u0027"},{"line_number":2528,"context_line":"                            \u0027failing step: %(step)s\u0027)"},{"line_number":2529,"context_line":"                          % {\u0027interfaces\u0027: list(CLEANING_INTERFACE_PRIORITY),"},{"line_number":2530,"context_line":"                             \u0027step\u0027: step})"},{"line_number":2531,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_3a43d6b3","line":2528,"in_reply_to":"ba15a1d1_b33dda90","updated":"2015-09-17 15:50:26.000000000","message":"Yeah, the only problem with that way is that step can be very small or very large... we prefer to keep things like that at the end.","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":2527,"context_line":"            errors.append(_(\u0027\"interface\" must be one of %(interfaces)s, \u0027"},{"line_number":2528,"context_line":"                            \u0027failing step: %(step)s\u0027)"},{"line_number":2529,"context_line":"                          % {\u0027interfaces\u0027: list(CLEANING_INTERFACE_PRIORITY),"},{"line_number":2530,"context_line":"                             \u0027step\u0027: step})"},{"line_number":2531,"context_line":""},{"line_number":2532,"context_line":"    if errors:"},{"line_number":2533,"context_line":"        raise exception.InvalidParameterValue("}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_93ec562b","line":2530,"updated":"2015-09-17 15:05:51.000000000","message":"you could be fancy and just have one error string per step, but someone else could propose that. /me too tired ;)","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":2531,"context_line":""},{"line_number":2532,"context_line":"    if errors:"},{"line_number":2533,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":2534,"context_line":"            _(\u0027zap_steps was improperly formatted: %s\u0027) % errors)"},{"line_number":2535,"context_line":""},{"line_number":2536,"context_line":""},{"line_number":2537,"context_line":"def clean_or_zap(node):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_3376aad7","line":2534,"updated":"2015-09-17 15:05:51.000000000","message":"s/was/were/\n\nIt isn\u0027t that they weren\u0027t formatted properly, it is that they are missing or have invalid information. How about \u0027Invalid zap steps: ...\u0027\n\nand maybe \u0027; \u0027.join(errors)","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        return cctxt.call(context, \u0027do_provisioning_action\u0027,"},{"line_number":342,"context_line":"                          node_id\u003dnode_id, action\u003daction)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    def do_node_zap(self, context, node_id, zap_steps, topic\u003dNone):"},{"line_number":345,"context_line":"        \"\"\"Signal to conductor service to perform the given action on a node."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        :param context: request context."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_495a2d85","line":344,"updated":"2015-09-14 16:49:14.000000000","message":"I was actually thinking how confusing it is, to have do_provisioning_action() for *some* provision actions, and specific methods for others. We could probably clean it up by generalizing do_provisioning_action() but I won\u0027t make you do that :)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        return cctxt.call(context, \u0027do_provisioning_action\u0027,"},{"line_number":342,"context_line":"                          node_id\u003dnode_id, action\u003daction)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    def do_node_zap(self, context, node_id, zap_steps, topic\u003dNone):"},{"line_number":345,"context_line":"        \"\"\"Signal to conductor service to perform the given action on a node."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        :param context: request context."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c365a745","line":344,"in_reply_to":"ba15a1d1_495a2d85","updated":"2015-09-15 00:25:05.000000000","message":"I agree, do_node_(deploy | teardown | zap) is silly.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                          node_id\u003dnode_id, action\u003daction)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    def do_node_zap(self, context, node_id, zap_steps, topic\u003dNone):"},{"line_number":345,"context_line":"        \"\"\"Signal to conductor service to perform the given action on a node."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        :param context: request context."},{"line_number":348,"context_line":"        :param node_id: node id or uuid."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_891285b3","line":345,"updated":"2015-09-14 16:49:14.000000000","message":"s/the given action/zapping/ ?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                          node_id\u003dnode_id, action\u003daction)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    def do_node_zap(self, context, node_id, zap_steps, topic\u003dNone):"},{"line_number":345,"context_line":"        \"\"\"Signal to conductor service to perform the given action on a node."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        :param context: request context."},{"line_number":348,"context_line":"        :param node_id: node id or uuid."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_034cffc5","line":345,"in_reply_to":"ba15a1d1_891285b3","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":353,"context_line":"                async task."},{"line_number":354,"context_line":"        :raises: InvalidStateRequested if the requested action can not"},{"line_number":355,"context_line":"                 be performed."},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        This encapsulates some provisioning actions in a single call."},{"line_number":358,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_e91d41be","line":355,"updated":"2015-09-14 16:49:14.000000000","message":"s/the requested action/zapping/","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":353,"context_line":"                async task."},{"line_number":354,"context_line":"        :raises: InvalidStateRequested if the requested action can not"},{"line_number":355,"context_line":"                 be performed."},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        This encapsulates some provisioning actions in a single call."},{"line_number":358,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_a3c75311","line":355,"in_reply_to":"ba15a1d1_e91d41be","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        :raises: InvalidStateRequested if the requested action can not"},{"line_number":355,"context_line":"                 be performed."},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        This encapsulates some provisioning actions in a single call."},{"line_number":358,"context_line":"        \"\"\""},{"line_number":359,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":360,"context_line":"        return cctxt.call(context, \u0027do_node_zap\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_a930a957","line":357,"updated":"2015-09-14 16:49:14.000000000","message":"Gotta love that copy/paste!\n\ndon\u0027t think we want this line.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        :raises: InvalidStateRequested if the requested action can not"},{"line_number":355,"context_line":"                 be performed."},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        This encapsulates some provisioning actions in a single call."},{"line_number":358,"context_line":"        \"\"\""},{"line_number":359,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":360,"context_line":"        return cctxt.call(context, \u0027do_node_zap\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c3f36772","line":357,"in_reply_to":"ba15a1d1_a930a957","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        :param node_id: node id or uuid."},{"line_number":349,"context_line":"        :param zap_steps: a list of zap step dictionaries."},{"line_number":350,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":351,"context_line":"        :raises: InvalidParameterValue"},{"line_number":352,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":353,"context_line":"                async task."},{"line_number":354,"context_line":"        :raises: InvalidStateRequested if zapping can not"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_d8b55431","line":351,"updated":"2015-09-16 07:50:53.000000000","message":"May be\n\n  :raises: InvalidParameterValue, if validation of zap step fails.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        :param node_id: node id or uuid."},{"line_number":349,"context_line":"        :param zap_steps: a list of zap step dictionaries."},{"line_number":350,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":351,"context_line":"        :raises: InvalidParameterValue"},{"line_number":352,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":353,"context_line":"                async task."},{"line_number":354,"context_line":"        :raises: InvalidStateRequested if zapping can not"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_61d1d7f9","line":351,"in_reply_to":"ba15a1d1_d8b55431","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"}],"ironic/drivers/modules/agent_base_vendor.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        AGENT_PORT defaults to 9999."},{"line_number":228,"context_line":"        \"\"\""},{"line_number":229,"context_line":"        node \u003d task.node"},{"line_number":230,"context_line":"        clean \u003d (\u0027cleaning\u0027 if node.provision_state in"},{"line_number":231,"context_line":"                 (states.CLEANING, states.CLEANWAIT) else \u0027zapping\u0027)"},{"line_number":232,"context_line":"        driver_internal_info \u003d node.driver_internal_info"},{"line_number":233,"context_line":"        LOG.debug("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_43e76ce4","line":230,"updated":"2015-09-14 15:02:13.000000000","message":"Ditto re variable name","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        AGENT_PORT defaults to 9999."},{"line_number":228,"context_line":"        \"\"\""},{"line_number":229,"context_line":"        node \u003d task.node"},{"line_number":230,"context_line":"        clean \u003d (\u0027cleaning\u0027 if node.provision_state in"},{"line_number":231,"context_line":"                 (states.CLEANING, states.CLEANWAIT) else \u0027zapping\u0027)"},{"line_number":232,"context_line":"        driver_internal_info \u003d node.driver_internal_info"},{"line_number":233,"context_line":"        LOG.debug("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_83bb2f72","line":230,"in_reply_to":"ba15a1d1_43e76ce4","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"55705d56c75e5f8e5f7b9a6668bcd943189dffe2","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":271,"context_line":"            # release starts."},{"line_number":272,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":273,"context_line":"                                          states.ZAPWAIT, states.ZAPPING):"},{"line_number":274,"context_line":"                node.touch_provisioning()"},{"line_number":275,"context_line":"                if not node.clean_step:"},{"line_number":276,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(clean)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_afbe66fd","line":273,"updated":"2015-09-14 16:51:36.000000000","message":"ditto about not allowing ZAPPING","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":271,"context_line":"            # release starts."},{"line_number":272,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":273,"context_line":"                                          states.ZAPWAIT, states.ZAPPING):"},{"line_number":274,"context_line":"                node.touch_provisioning()"},{"line_number":275,"context_line":"                if not node.clean_step:"},{"line_number":276,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(clean)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_b403190f","line":273,"updated":"2015-09-14 16:49:14.000000000","message":"not sure you need states.zapping","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            # is deployed would fail. Should be removed once the Mitaka"},{"line_number":271,"context_line":"            # release starts."},{"line_number":272,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":273,"context_line":"                                          states.ZAPWAIT, states.ZAPPING):"},{"line_number":274,"context_line":"                node.touch_provisioning()"},{"line_number":275,"context_line":"                if not node.clean_step:"},{"line_number":276,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(clean)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_43ae772f","line":273,"in_reply_to":"ba15a1d1_afbe66fd","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                    self._notify_conductor_resume_clean(task)"},{"line_number":281,"context_line":"                else:"},{"line_number":282,"context_line":"                    msg \u003d _(\u0027Node failed to check %s progress.\u0027) % clean"},{"line_number":283,"context_line":"                    self.continue_cleaning(task, **kwargs)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        except Exception as e:"},{"line_number":286,"context_line":"            err_info \u003d {\u0027node\u0027: node.uuid, \u0027msg\u0027: msg, \u0027e\u0027: e}"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_4f5c6a25","line":283,"updated":"2015-09-14 16:49:14.000000000","message":"you only use that clean/whatever variable here. I think it should be set after line 273, not 230.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                    self._notify_conductor_resume_clean(task)"},{"line_number":281,"context_line":"                else:"},{"line_number":282,"context_line":"                    msg \u003d _(\u0027Node failed to check %s progress.\u0027) % clean"},{"line_number":283,"context_line":"                    self.continue_cleaning(task, **kwargs)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        except Exception as e:"},{"line_number":286,"context_line":"            err_info \u003d {\u0027node\u0027: node.uuid, \u0027msg\u0027: msg, \u0027e\u0027: e}"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_237823c4","line":283,"in_reply_to":"ba15a1d1_4f5c6a25","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f3a269971b59a86b300ca96b89d2b7083ea975d2","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                           \u0027%(msg)s exception: %(e)s\u0027) % err_info"},{"line_number":289,"context_line":"            LOG.exception(last_error)"},{"line_number":290,"context_line":"            if node.provision_state in (states.CLEANING, states.CLEANWAIT,"},{"line_number":291,"context_line":"                                        states.ZAPPING, states.ZAPWAIT):"},{"line_number":292,"context_line":"                manager.cleaning_error_handler(task, last_error)"},{"line_number":293,"context_line":"            else:"},{"line_number":294,"context_line":"                deploy_utils.set_failed_state(task, last_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_4f254aa9","line":291,"updated":"2015-09-14 16:49:14.000000000","message":"ditto, not sure if states.zapping is needed here.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                           \u0027%(msg)s exception: %(e)s\u0027) % err_info"},{"line_number":289,"context_line":"            LOG.exception(last_error)"},{"line_number":290,"context_line":"            if node.provision_state in (states.CLEANING, states.CLEANWAIT,"},{"line_number":291,"context_line":"                                        states.ZAPPING, states.ZAPWAIT):"},{"line_number":292,"context_line":"                manager.cleaning_error_handler(task, last_error)"},{"line_number":293,"context_line":"            else:"},{"line_number":294,"context_line":"                deploy_utils.set_failed_state(task, last_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_437517c9","line":291,"in_reply_to":"ba15a1d1_4f254aa9","updated":"2015-09-15 00:25:05.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"54154081df0b63c82fafdfcd056b9f44c0acaa5c","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":271,"context_line":"                                          states.ZAPWAIT):"},{"line_number":272,"context_line":"                node.touch_provisioning()"},{"line_number":273,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":274,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":275,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_2e7455cd","line":273,"updated":"2015-09-15 23:42:52.000000000","message":"Seems like this should be an or?","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e202c4cd1ff11959df14cb716dad77e73cfc2d28","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":271,"context_line":"                                          states.ZAPWAIT):"},{"line_number":272,"context_line":"                node.touch_provisioning()"},{"line_number":273,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":274,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":275,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_51584832","line":273,"in_reply_to":"ba15a1d1_2e7455cd","updated":"2015-09-16 00:04:20.000000000","message":"They should default/are reset to {} when not in cleaning/zapping. If it was or, it would always be true.","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c65fa3773e581757966d8f55f59e5f167c0140f3","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":271,"context_line":"                                          states.ZAPWAIT):"},{"line_number":272,"context_line":"                node.touch_provisioning()"},{"line_number":273,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":274,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":275,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_e5e981e7","line":273,"in_reply_to":"ba15a1d1_51584832","updated":"2015-09-16 13:58:11.000000000","message":"{} is falsy, so the AND will never be true AFAIK... one will always be {}","commit_id":"592f2f590e11b107c2ce7ad3ac527f0aeae111d4"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9c459e7bb925dce2cb9cc729593eb3ed7dd0b619","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                                                    \u0027payload version: %s\u0027)"},{"line_number":146,"context_line":"                                                  % version)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _notify_conductor_resume_clean(self, task):"},{"line_number":149,"context_line":"        LOG.debug(\u0027Sending RPC to conductor to resume cleaning for node %s\u0027,"},{"line_number":150,"context_line":"                  task.node.uuid)"},{"line_number":151,"context_line":"        uuid \u003d task.node.uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_48608fa5","line":148,"updated":"2015-09-16 10:31:44.000000000","message":"cleaning/zapping?","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                                                    \u0027payload version: %s\u0027)"},{"line_number":146,"context_line":"                                                  % version)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _notify_conductor_resume_clean(self, task):"},{"line_number":149,"context_line":"        LOG.debug(\u0027Sending RPC to conductor to resume cleaning for node %s\u0027,"},{"line_number":150,"context_line":"                  task.node.uuid)"},{"line_number":151,"context_line":"        uuid \u003d task.node.uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_af6a7bec","line":148,"in_reply_to":"ba15a1d1_48608fa5","updated":"2015-09-16 22:00:37.000000000","message":"I don\u0027t think that\u0027s necessary. Lots of things refer to cleaning, as zapping is really just cleaning initiated by the user and with provide steps/priority. To users, we should be very clear on the separation. Internally, treating them the same prevents massive duplications.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                                                  % version)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _notify_conductor_resume_clean(self, task):"},{"line_number":149,"context_line":"        LOG.debug(\u0027Sending RPC to conductor to resume cleaning for node %s\u0027,"},{"line_number":150,"context_line":"                  task.node.uuid)"},{"line_number":151,"context_line":"        uuid \u003d task.node.uuid"},{"line_number":152,"context_line":"        rpc \u003d rpcapi.ConductorAPI()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_ce9d7567","line":149,"updated":"2015-09-16 17:25:03.000000000","message":"s/cleaning/ well, cleaning or zapping I guess.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                                                  % version)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _notify_conductor_resume_clean(self, task):"},{"line_number":149,"context_line":"        LOG.debug(\u0027Sending RPC to conductor to resume cleaning for node %s\u0027,"},{"line_number":150,"context_line":"                  task.node.uuid)"},{"line_number":151,"context_line":"        uuid \u003d task.node.uuid"},{"line_number":152,"context_line":"        rpc \u003d rpcapi.ConductorAPI()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_2f5e6b44","line":149,"in_reply_to":"ba15a1d1_ce9d7567","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9c459e7bb925dce2cb9cc729593eb3ed7dd0b619","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        to tell if an ordering change will cause a cleaning issue. Therefore,"},{"line_number":166,"context_line":"        we restart cleaning."},{"line_number":167,"context_line":"        \"\"\""},{"line_number":168,"context_line":"        command \u003d self._get_completed_cleaning_command(task)"},{"line_number":169,"context_line":"        LOG.debug(\u0027Cleaning command status for node %(node)s on step %(step)s:\u0027"},{"line_number":170,"context_line":"                  \u0027 %(command)s\u0027, {\u0027node\u0027: task.node.uuid,"},{"line_number":171,"context_line":"                                   \u0027step\u0027: task.node.clean_step,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_28b75bf6","line":168,"updated":"2015-09-16 10:31:44.000000000","message":"Should the messages also be changed in this function?","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        to tell if an ordering change will cause a cleaning issue. Therefore,"},{"line_number":166,"context_line":"        we restart cleaning."},{"line_number":167,"context_line":"        \"\"\""},{"line_number":168,"context_line":"        command \u003d self._get_completed_cleaning_command(task)"},{"line_number":169,"context_line":"        LOG.debug(\u0027Cleaning command status for node %(node)s on step %(step)s:\u0027"},{"line_number":170,"context_line":"                  \u0027 %(command)s\u0027, {\u0027node\u0027: task.node.uuid,"},{"line_number":171,"context_line":"                                   \u0027step\u0027: task.node.clean_step,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_e167274b","line":168,"in_reply_to":"ba15a1d1_28b75bf6","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9c459e7bb925dce2cb9cc729593eb3ed7dd0b619","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        command \u003d self._get_completed_cleaning_command(task)"},{"line_number":169,"context_line":"        LOG.debug(\u0027Cleaning command status for node %(node)s on step %(step)s:\u0027"},{"line_number":170,"context_line":"                  \u0027 %(command)s\u0027, {\u0027node\u0027: task.node.uuid,"},{"line_number":171,"context_line":"                                   \u0027step\u0027: task.node.clean_step,"},{"line_number":172,"context_line":"                                   \u0027command\u0027: command})"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        if not command:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_6851d335","line":171,"updated":"2015-09-16 10:31:44.000000000","message":"Seems that zap_step should be logged in case of zapping","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        command \u003d self._get_completed_cleaning_command(task)"},{"line_number":169,"context_line":"        LOG.debug(\u0027Cleaning command status for node %(node)s on step %(step)s:\u0027"},{"line_number":170,"context_line":"                  \u0027 %(command)s\u0027, {\u0027node\u0027: task.node.uuid,"},{"line_number":171,"context_line":"                                   \u0027step\u0027: task.node.clean_step,"},{"line_number":172,"context_line":"                                   \u0027command\u0027: command})"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        if not command:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8158ab8b","line":171,"in_reply_to":"ba15a1d1_6851d335","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                         \u0027resetting clean steps and rebooting the node.\u0027),"},{"line_number":190,"context_line":"                     task.node.uuid)"},{"line_number":191,"context_line":"            try:"},{"line_number":192,"context_line":"                manager.set_node_cleaning_steps(task)"},{"line_number":193,"context_line":"            except exception.NodeCleaningFailure:"},{"line_number":194,"context_line":"                msg \u003d (_(\u0027Could not restart cleaning on node %(node)s: \u0027"},{"line_number":195,"context_line":"                         \u0027%(err)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_c9324ff2","line":192,"updated":"2015-09-16 17:25:03.000000000","message":"you don\u0027t want to do this for zapping.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                         \u0027resetting clean steps and rebooting the node.\u0027),"},{"line_number":190,"context_line":"                     task.node.uuid)"},{"line_number":191,"context_line":"            try:"},{"line_number":192,"context_line":"                manager.set_node_cleaning_steps(task)"},{"line_number":193,"context_line":"            except exception.NodeCleaningFailure:"},{"line_number":194,"context_line":"                msg \u003d (_(\u0027Could not restart cleaning on node %(node)s: \u0027"},{"line_number":195,"context_line":"                         \u0027%(err)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_a4293d39","line":192,"in_reply_to":"ba15a1d1_c9324ff2","updated":"2015-09-16 22:00:37.000000000","message":"I think we don\u0027t want to do any of this block in zapping. These are operator initiated unlike cleaning, so if you choose to zap while upgrading the agent...uh...it can go badly. And I don\u0027t want to restart in case some of the zap steps are not idempotent (which I would never do, but might be reasonable) or potentially really long like a burn-in.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":271,"context_line":"                                          states.ZAPWAIT):"},{"line_number":272,"context_line":"                node.touch_provisioning()"},{"line_number":273,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":274,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":275,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_6eeb0979","line":273,"updated":"2015-09-16 17:25:03.000000000","message":"Just a comment. Lucas is adding a patch to \u0027abort\u0027 CLEANWAIT. I believe it\u0027ll leave node.clean_step with whatever it had. Which could cause problems here...\n\nI think I\u0027d prefer if we separated each case, eg:\n   if node.provision_state \u003d\u003d states.ZAPWAIT: \n      no-step \u003d not node.zap_step\n   elif:\n      no-step \u003d not node.clean_step\n\nif no-step:\n    LOG...\n    if node.provision_state in ...","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":271,"context_line":"                                          states.ZAPWAIT):"},{"line_number":272,"context_line":"                node.touch_provisioning()"},{"line_number":273,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":274,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":275,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_77a3d500","line":273,"in_reply_to":"ba15a1d1_6eeb0979","updated":"2015-09-16 22:00:37.000000000","message":"Ahh that\u0027s a great catch. Done.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                                          states.ZAPWAIT):"},{"line_number":272,"context_line":"                node.touch_provisioning()"},{"line_number":273,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":274,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":275,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"},{"line_number":277,"context_line":"                    msg \u003d (_(\u0027Node failed to start the next %s step.\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_987d9ce9","line":274,"updated":"2015-09-16 07:50:53.000000000","message":"nit:\n\ns/%(action)s/%(action)sing","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                                          states.ZAPWAIT):"},{"line_number":272,"context_line":"                node.touch_provisioning()"},{"line_number":273,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":274,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":275,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"},{"line_number":277,"context_line":"                    msg \u003d (_(\u0027Node failed to start the next %s step.\u0027) %"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_e10ba78c","line":274,"in_reply_to":"ba15a1d1_987d9ce9","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1a21ff79d06f758aeb3c1a513013a0e2def2e29a","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"},{"line_number":277,"context_line":"                    msg \u003d (_(\u0027Node failed to start the next %s step.\u0027) %"},{"line_number":278,"context_line":"                           manager.clean_or_zap(node))"},{"line_number":279,"context_line":"                    if node.provision_state in (states.CLEANWAIT,"},{"line_number":280,"context_line":"                                                states.CLEANING):"},{"line_number":281,"context_line":"                        manager.set_node_cleaning_steps(task)"},{"line_number":282,"context_line":"                    self._notify_conductor_resume_clean(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_ce1ed5ba","line":279,"updated":"2015-09-16 17:25:03.000000000","message":"might be useful to have a #TODO(lucasagomes) to change to only states.CLEANWAIT in Mitaka.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"},{"line_number":277,"context_line":"                    msg \u003d (_(\u0027Node failed to start the next %s step.\u0027) %"},{"line_number":278,"context_line":"                           manager.clean_or_zap(node))"},{"line_number":279,"context_line":"                    if node.provision_state in (states.CLEANWAIT,"},{"line_number":280,"context_line":"                                                states.CLEANING):"},{"line_number":281,"context_line":"                        manager.set_node_cleaning_steps(task)"},{"line_number":282,"context_line":"                    self._notify_conductor_resume_clean(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_24020d0c","line":279,"in_reply_to":"ba15a1d1_ce1ed5ba","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                    if node.provision_state in (states.CLEANWAIT,"},{"line_number":280,"context_line":"                                                states.CLEANING):"},{"line_number":281,"context_line":"                        manager.set_node_cleaning_steps(task)"},{"line_number":282,"context_line":"                    self._notify_conductor_resume_clean(task)"},{"line_number":283,"context_line":"                else:"},{"line_number":284,"context_line":"                    msg \u003d (_(\u0027Node failed to check %s progress.\u0027) %"},{"line_number":285,"context_line":"                           manager.clean_or_zap(node))"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_eb140445","line":282,"updated":"2015-09-16 07:50:53.000000000","message":"Can we validate here if all the zap step provided are valid ? By now, we should be having a list of all possible clean steps. Good thing will be operator gets to know invalid zap steps before even starting zapping.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                    if node.provision_state in (states.CLEANWAIT,"},{"line_number":280,"context_line":"                                                states.CLEANING):"},{"line_number":281,"context_line":"                        manager.set_node_cleaning_steps(task)"},{"line_number":282,"context_line":"                    self._notify_conductor_resume_clean(task)"},{"line_number":283,"context_line":"                else:"},{"line_number":284,"context_line":"                    msg \u003d (_(\u0027Node failed to check %s progress.\u0027) %"},{"line_number":285,"context_line":"                           manager.clean_or_zap(node))"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_573a51cd","line":282,"in_reply_to":"ba15a1d1_eb140445","updated":"2015-09-16 22:00:37.000000000","message":"Let\u0027s do that as a followup, but I agree. Failing earlier is a good idea.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                                                    \u0027payload version: %s\u0027)"},{"line_number":212,"context_line":"                                                  % version)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _notify_conductor_resume_clean(self, task):"},{"line_number":215,"context_line":"        LOG.debug(\u0027Sending RPC to conductor to resume %(action)sing for node \u0027"},{"line_number":216,"context_line":"                  \u0027%(node)s\u0027, {\u0027action\u0027: manager.clean_or_zap(task.node),"},{"line_number":217,"context_line":"                               \u0027node\u0027: task.node.uuid})"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_9692044b","line":214,"updated":"2015-09-17 15:05:51.000000000","message":"It might be nice to have a docstring that mentions this is for cleaning/zapping.\n\nDId I mention how much I hate that we have \u0027clean\u0027 and \u0027zap\u0027? :)","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"dc3520e60f4e6a6a513f2678109963bb7f63de6e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                                                  % version)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _notify_conductor_resume_clean(self, task):"},{"line_number":215,"context_line":"        LOG.debug(\u0027Sending RPC to conductor to resume %(action)sing for node \u0027"},{"line_number":216,"context_line":"                  \u0027%(node)s\u0027, {\u0027action\u0027: manager.clean_or_zap(task.node),"},{"line_number":217,"context_line":"                               \u0027node\u0027: task.node.uuid})"},{"line_number":218,"context_line":"        uuid \u003d task.node.uuid"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_d0f4f95b","line":215,"updated":"2015-09-17 16:40:06.000000000","message":"Nit: this ends up as \u0027zaping\u0027, not \u0027zapping\u0027 :(","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        msg_details \u003d {\u0027action\u0027: manager.clean_or_zap(node),"},{"line_number":238,"context_line":"                       \u0027node\u0027: node.uuid,"},{"line_number":239,"context_line":"                       \u0027command\u0027: command,"},{"line_number":240,"context_line":"                       \u0027step\u0027: \u0027unset\u0027}"},{"line_number":241,"context_line":"        # TODO(lucasagomes) to change to only states.CLEANWAIT in Mitaka."},{"line_number":242,"context_line":"        if node.provision_state in (states.CLEANWAIT, states.CLEANING):"},{"line_number":243,"context_line":"            msg_details[\u0027step\u0027] \u003d node.clean_step"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_16583487","line":240,"updated":"2015-09-17 15:05:51.000000000","message":"Why do you want this?","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                   {\u0027action\u0027: manager.clean_or_zap(node),"},{"line_number":257,"context_line":"                    \u0027node\u0027: node.uuid,"},{"line_number":258,"context_line":"                    \u0027err\u0027: command.get(\u0027command_error\u0027),"},{"line_number":259,"context_line":"                    \u0027step\u0027: node.clean_step})"},{"line_number":260,"context_line":"            LOG.error(msg)"},{"line_number":261,"context_line":"            return manager.cleaning_error_handler(task, msg)"},{"line_number":262,"context_line":"        # TODO(lucasagomes) to change to only states.CLEANWAIT in Mitaka."}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_9fe0d7ce","line":259,"updated":"2015-09-17 15:05:51.000000000","message":"this is clean or zap step, right?","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"67c4acdfd1a9dde6bb6c3cc7d93a46968188c469","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            # necessarily idempotent like clean steps and can be even longer"},{"line_number":285,"context_line":"            # running."},{"line_number":286,"context_line":"            LOG.warning(_LW(\u0027Detected a clean version mismatch for node \u0027"},{"line_number":287,"context_line":"                            \u0027%(node)s, not restarting zapping. Re-executing \u0027"},{"line_number":288,"context_line":"                            \u0027step %(step)s.\u0027),"},{"line_number":289,"context_line":"                        {\u0027node\u0027: node.uuid, \u0027step\u0027: node.zap_step})"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_3a067652","line":287,"updated":"2015-09-17 15:50:26.000000000","message":"We say \"not restarting zapping\" but also say we\u0027re \"re-executing\" the step, that seems like a conflict.","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":387,"context_line":"                                          states.ZAPWAIT):"},{"line_number":388,"context_line":"                node.touch_provisioning()"},{"line_number":389,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":390,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":391,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":392,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_caa76fbb","line":389,"updated":"2015-09-17 15:05:51.000000000","message":"I had a comment in revision 6 about this, copying it again:\n\nJust a comment. Lucas is adding a patch to \u0027abort\u0027 CLEANWAIT. I believe it\u0027ll leave node.clean_step with whatever it had. Which could cause problems here...\n\nI think I\u0027d prefer if we separated each case, eg:\n   if node.provision_state \u003d\u003d states.ZAPWAIT: \n      no-step \u003d not node.zap_step\n   elif:\n      no-step \u003d not node.clean_step\n\nif no-step:\n    LOG...\n    if node.provision_state in ...","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"67c4acdfd1a9dde6bb6c3cc7d93a46968188c469","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            elif node.provision_state in (states.CLEANWAIT, states.CLEANING,"},{"line_number":387,"context_line":"                                          states.ZAPWAIT):"},{"line_number":388,"context_line":"                node.touch_provisioning()"},{"line_number":389,"context_line":"                if not node.clean_step and not node.zap_step:"},{"line_number":390,"context_line":"                    LOG.debug(\u0027Node %(node)s just booted to start %(action)s.\u0027,"},{"line_number":391,"context_line":"                              {\u0027node\u0027: node.uuid,"},{"line_number":392,"context_line":"                               \u0027action\u0027: manager.clean_or_zap(node)})"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_7a9e2e08","line":389,"in_reply_to":"ba15a1d1_caa76fbb","updated":"2015-09-17 15:50:26.000000000","message":"+1","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6b302594996ceee459719cac940dc8278fcb3a5f","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                    if node.provision_state in (states.CLEANWAIT,"},{"line_number":398,"context_line":"                                                states.CLEANING):"},{"line_number":399,"context_line":"                        manager.set_node_cleaning_steps(task)"},{"line_number":400,"context_line":"                    self._notify_conductor_resume_clean(task)"},{"line_number":401,"context_line":"                else:"},{"line_number":402,"context_line":"                    msg \u003d (_(\u0027Node failed to check %s progress.\u0027) %"},{"line_number":403,"context_line":"                           manager.clean_or_zap(node))"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_0aa80776","line":400,"updated":"2015-09-17 15:05:51.000000000","message":"Ramesh asked: Can we validate here if all the zap step provided are valid\n\nMaybe add a #TODO for that? Or open a bug?","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"98df21d2bdfb70865623bba6e60e99fd8dc940eb","unresolved":false,"context_lines":[{"line_number":503,"context_line":"            LOG.debug(\u0027Clean step still running for node %(node)s: %(step)s\u0027,"},{"line_number":504,"context_line":"                      {\u0027step\u0027: last_step, \u0027node\u0027: task.node.uuid})"},{"line_number":505,"context_line":"            return"},{"line_number":506,"context_line":"        elif (last_command[\u0027command_status\u0027] \u003d\u003d \u0027SUCCEEDED\u0027 and"},{"line_number":507,"context_line":"              last_step !\u003d task.node.clean_step):"},{"line_number":508,"context_line":"            # A previous clean_step was running, the new command has not yet"},{"line_number":509,"context_line":"            # started."}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_1c15aae3","line":506,"updated":"2015-09-17 17:18:21.000000000","message":"Need to support zap_step here.","commit_id":"1a5e20ed62348081122175fd5b919c6d4bfd69d1"}],"ironic/tests/api/v1/test_nodes.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1965,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":1966,"context_line":"        mock_dpa.assert_called_once_with(mock.ANY, self.node.uuid,"},{"line_number":1967,"context_line":"                                         zap_steps,"},{"line_number":1968,"context_line":"                                         \u0027test-topic\u0027)"},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":"    def test_inspect_already_in_progress(self):"},{"line_number":1971,"context_line":"        node \u003d self.node"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_831264b3","line":1968,"updated":"2015-09-14 15:02:13.000000000","message":"Could probably factor these two into a common test with provision_state as an argument, if you\u0027d like.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":1965,"context_line":"        self.assertEqual(b\u0027\u0027, ret.body)"},{"line_number":1966,"context_line":"        mock_dpa.assert_called_once_with(mock.ANY, self.node.uuid,"},{"line_number":1967,"context_line":"                                         zap_steps,"},{"line_number":1968,"context_line":"                                         \u0027test-topic\u0027)"},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":"    def test_inspect_already_in_progress(self):"},{"line_number":1971,"context_line":"        node \u003d self.node"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_037f1fab","line":1968,"in_reply_to":"ba15a1d1_831264b3","updated":"2015-09-15 00:25:05.000000000","message":"++, will do in the next patchset (need to fix up all the tests)","commit_id":"0149570998702365dfd96012fd046e1d37861282"}],"ironic/tests/conductor/test_manager.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1552,"context_line":"        # Cleaning should be executed in this order"},{"line_number":1553,"context_line":"        self.clean_steps \u003d [self.deploy_erase, self.power_update,"},{"line_number":1554,"context_line":"                            self.deploy_update]"},{"line_number":1555,"context_line":"        # Zap step"},{"line_number":1556,"context_line":"        self.deploy_raid \u003d {"},{"line_number":1557,"context_line":"            \u0027step\u0027: \u0027build_raid\u0027, \u0027priority\u0027: 0, \u0027interface\u0027: \u0027deploy\u0027}"},{"line_number":1558,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c3205cfa","side":"PARENT","line":1555,"updated":"2015-09-14 15:02:13.000000000","message":"Meh, I\u0027d leave this comment in, why not?","commit_id":"f77af2c0191db6fc09640e03ff5b854cf0936a46"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"2bae90bcbe82316b9471a51206a660fcdcb28cf9","unresolved":false,"context_lines":[{"line_number":1552,"context_line":"        # Cleaning should be executed in this order"},{"line_number":1553,"context_line":"        self.clean_steps \u003d [self.deploy_erase, self.power_update,"},{"line_number":1554,"context_line":"                            self.deploy_update]"},{"line_number":1555,"context_line":"        # Zap step"},{"line_number":1556,"context_line":"        self.deploy_raid \u003d {"},{"line_number":1557,"context_line":"            \u0027step\u0027: \u0027build_raid\u0027, \u0027priority\u0027: 0, \u0027interface\u0027: \u0027deploy\u0027}"},{"line_number":1558,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c34fe790","side":"PARENT","line":1555,"in_reply_to":"ba15a1d1_c3205cfa","updated":"2015-09-15 00:25:05.000000000","message":"Heh thought I added it.","commit_id":"f77af2c0191db6fc09640e03ff5b854cf0936a46"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"        mock_spawn.assert_called_with("},{"line_number":1577,"context_line":"            self.service._do_node_zap, mock.ANY, zap_steps)"},{"line_number":1578,"context_line":""},{"line_number":1579,"context_line":"        # Node will be moved to AVAILABLE after cleaning, not tested here"},{"line_number":1580,"context_line":"        self.assertEqual(states.ZAPPING, node.provision_state)"},{"line_number":1581,"context_line":"        self.assertEqual(states.MANAGEABLE, node.target_provision_state)"},{"line_number":1582,"context_line":"        self.assertIsNone(node.last_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_036e542f","line":1579,"updated":"2015-09-14 15:02:13.000000000","message":"This note seems like copy pasta :)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"        mock_spawn.assert_called_with("},{"line_number":1577,"context_line":"            self.service._do_node_zap, mock.ANY, zap_steps)"},{"line_number":1578,"context_line":""},{"line_number":1579,"context_line":"        # Node will be moved to AVAILABLE after cleaning, not tested here"},{"line_number":1580,"context_line":"        self.assertEqual(states.ZAPPING, node.provision_state)"},{"line_number":1581,"context_line":"        self.assertEqual(states.MANAGEABLE, node.target_provision_state)"},{"line_number":1582,"context_line":"        self.assertIsNone(node.last_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_4d6f5292","line":1579,"in_reply_to":"ba15a1d1_036e542f","updated":"2015-09-15 22:44:37.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1588,"context_line":"        # Test retrying ZAPPING after a failure with different steps"},{"line_number":1589,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":1590,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"},{"line_number":1591,"context_line":"            provision_state\u003dstates.MANAGEABLE,"},{"line_number":1592,"context_line":"            zap_step\u003d{\u0027step\u0027: \u0027upgrade_firmware\u0027, \u0027interface\u0027: \u0027deploy\u0027})"},{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":"        zap_steps \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_83eee489","line":1591,"updated":"2015-09-14 15:02:13.000000000","message":"Should this be ZAPFAIL?","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":1588,"context_line":"        # Test retrying ZAPPING after a failure with different steps"},{"line_number":1589,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":1590,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"},{"line_number":1591,"context_line":"            provision_state\u003dstates.MANAGEABLE,"},{"line_number":1592,"context_line":"            zap_step\u003d{\u0027step\u0027: \u0027upgrade_firmware\u0027, \u0027interface\u0027: \u0027deploy\u0027})"},{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":"        zap_steps \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_ed6d0699","line":1591,"in_reply_to":"ba15a1d1_83eee489","updated":"2015-09-15 22:44:37.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1604,"context_line":"        mock_spawn.assert_called_with("},{"line_number":1605,"context_line":"            self.service._do_node_zap, mock.ANY, zap_steps)"},{"line_number":1606,"context_line":""},{"line_number":1607,"context_line":"        # Node will be moved to AVAILABLE after cleaning, not tested here"},{"line_number":1608,"context_line":"        self.assertEqual(states.ZAPPING, node.provision_state)"},{"line_number":1609,"context_line":"        self.assertEqual(states.MANAGEABLE, node.target_provision_state)"},{"line_number":1610,"context_line":"        self.assertIsNone(node.last_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_236b5820","line":1607,"updated":"2015-09-14 15:02:13.000000000","message":"Ditto","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":1604,"context_line":"        mock_spawn.assert_called_with("},{"line_number":1605,"context_line":"            self.service._do_node_zap, mock.ANY, zap_steps)"},{"line_number":1606,"context_line":""},{"line_number":1607,"context_line":"        # Node will be moved to AVAILABLE after cleaning, not tested here"},{"line_number":1608,"context_line":"        self.assertEqual(states.ZAPPING, node.provision_state)"},{"line_number":1609,"context_line":"        self.assertEqual(states.MANAGEABLE, node.target_provision_state)"},{"line_number":1610,"context_line":"        self.assertIsNone(node.last_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_4df672d8","line":1607,"in_reply_to":"ba15a1d1_236b5820","updated":"2015-09-15 22:44:37.000000000","message":"Done","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7c232d46ab88b109f4239941fa193621ac85c3a8","unresolved":false,"context_lines":[{"line_number":1747,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":1748,"context_line":"    def test__do_node_zap_validate_fail(self, mock_validate):"},{"line_number":1749,"context_line":"        # InvalidParameterValue should be cause node to go to CLEANFAIL"},{"line_number":1750,"context_line":"        self.config(clean_nodes\u003dTrue, group\u003d\u0027conductor\u0027)"},{"line_number":1751,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":1752,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":1753,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_237598ca","line":1750,"updated":"2015-09-14 15:02:13.000000000","message":"This makes me wonder... do we need clean_nodes\u003dTrue to do zapping? Is that desired?\n\n(also, doesn\u0027t this default to True already?)","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"0612299dfd9be3fb74107d86e67d56f67d2e3eb8","unresolved":false,"context_lines":[{"line_number":1747,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":1748,"context_line":"    def test__do_node_zap_validate_fail(self, mock_validate):"},{"line_number":1749,"context_line":"        # InvalidParameterValue should be cause node to go to CLEANFAIL"},{"line_number":1750,"context_line":"        self.config(clean_nodes\u003dTrue, group\u003d\u0027conductor\u0027)"},{"line_number":1751,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":1752,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":1753,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_eb8c1937","line":1750,"in_reply_to":"ba15a1d1_237598ca","updated":"2015-09-15 22:44:37.000000000","message":"We don\u0027t, and I don\u0027t think we should require it. I think the test I was copying was written before we enabled clean_nodes by default and not updated in the one-liner that flipped it.\n\nI\u0027m going to remove it, even if it isn\u0027t directly related. I want to ensure the tests work even with it disabled.","commit_id":"0149570998702365dfd96012fd046e1d37861282"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1560,"context_line":"        }"},{"line_number":1561,"context_line":"        self.zap_steps \u003d [self.deploy_raid, self.power_update_zap]"},{"line_number":1562,"context_line":""},{"line_number":1563,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.ConductorManager._spawn_worker\u0027)"},{"line_number":1564,"context_line":"    @mock.patch.object(manager, \u0027_validate_zap_steps\u0027)"},{"line_number":1565,"context_line":"    def test_do_node_zap(self, mock_validate, mock_spawn):"},{"line_number":1566,"context_line":"        # Test going from MANAGEABLE to ZAPPING"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_cb3020eb","line":1563,"updated":"2015-09-16 07:50:53.000000000","message":"autospec\u003dTrue","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1560,"context_line":"        }"},{"line_number":1561,"context_line":"        self.zap_steps \u003d [self.deploy_raid, self.power_update_zap]"},{"line_number":1562,"context_line":""},{"line_number":1563,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.ConductorManager._spawn_worker\u0027)"},{"line_number":1564,"context_line":"    @mock.patch.object(manager, \u0027_validate_zap_steps\u0027)"},{"line_number":1565,"context_line":"    def test_do_node_zap(self, mock_validate, mock_spawn):"},{"line_number":1566,"context_line":"        # Test going from MANAGEABLE to ZAPPING"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_f774c536","line":1563,"in_reply_to":"ba15a1d1_cb3020eb","updated":"2015-09-16 22:00:37.000000000","message":"Done and I agree. But if we\u0027re going to start nacking for this, someone needs to go fix up the existing tests, IMO, because now half this file is going to be autospecced and the rest will not.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1587,"context_line":"        self.assertIsNone(node.last_error)"},{"line_number":1588,"context_line":"        self.assertEqual(zap_steps, node.driver_internal_info[\u0027zap_steps\u0027])"},{"line_number":1589,"context_line":""},{"line_number":1590,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.ConductorManager._spawn_worker\u0027)"},{"line_number":1591,"context_line":"    @mock.patch.object(manager, \u0027_validate_zap_steps\u0027)"},{"line_number":1592,"context_line":"    def test_do_node_zap_retry(self, mock_validate, mock_spawn):"},{"line_number":1593,"context_line":"        # Test retrying ZAPPING after a failure with different steps"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_6b4eb470","line":1590,"updated":"2015-09-16 07:50:53.000000000","message":"autospec\u003dTrue","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1587,"context_line":"        self.assertIsNone(node.last_error)"},{"line_number":1588,"context_line":"        self.assertEqual(zap_steps, node.driver_internal_info[\u0027zap_steps\u0027])"},{"line_number":1589,"context_line":""},{"line_number":1590,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.ConductorManager._spawn_worker\u0027)"},{"line_number":1591,"context_line":"    @mock.patch.object(manager, \u0027_validate_zap_steps\u0027)"},{"line_number":1592,"context_line":"    def test_do_node_zap_retry(self, mock_validate, mock_spawn):"},{"line_number":1593,"context_line":"        # Test retrying ZAPPING after a failure with different steps"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_b7916d49","line":1590,"in_reply_to":"ba15a1d1_6b4eb470","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1748,"context_line":"        node.refresh()"},{"line_number":1749,"context_line":"        self.assertEqual(states.CLEANFAIL, node.provision_state)"},{"line_number":1750,"context_line":""},{"line_number":1751,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":1752,"context_line":"    def test__do_node_zap_validate_fail(self, mock_validate):"},{"line_number":1753,"context_line":"        # InvalidParameterValue should be cause node to go to CLEANFAIL"},{"line_number":1754,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8b51c810","line":1751,"updated":"2015-09-16 07:50:53.000000000","message":"autospec\u003dTrue","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1748,"context_line":"        node.refresh()"},{"line_number":1749,"context_line":"        self.assertEqual(states.CLEANFAIL, node.provision_state)"},{"line_number":1750,"context_line":""},{"line_number":1751,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"},{"line_number":1752,"context_line":"    def test__do_node_zap_validate_fail(self, mock_validate):"},{"line_number":1753,"context_line":"        # InvalidParameterValue should be cause node to go to CLEANFAIL"},{"line_number":1754,"context_line":"        mock_validate.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_d796613e","line":1751,"in_reply_to":"ba15a1d1_8b51c810","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1819,"context_line":"        self.assertEqual(states.CLEANING, node.provision_state)"},{"line_number":1820,"context_line":"        self.assertEqual(states.AVAILABLE, node.target_provision_state)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.set_node_cleaning_steps\u0027)"},{"line_number":1823,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.ConductorManager.\u0027"},{"line_number":1824,"context_line":"                \u0027_do_next_clean_step\u0027)"},{"line_number":1825,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_0b65b8df","line":1822,"updated":"2015-09-16 07:50:53.000000000","message":"autospec\u003dTrue","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1819,"context_line":"        self.assertEqual(states.CLEANING, node.provision_state)"},{"line_number":1820,"context_line":"        self.assertEqual(states.AVAILABLE, node.target_provision_state)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.set_node_cleaning_steps\u0027)"},{"line_number":1823,"context_line":"    @mock.patch(\u0027ironic.conductor.manager.ConductorManager.\u0027"},{"line_number":1824,"context_line":"                \u0027_do_next_clean_step\u0027)"},{"line_number":1825,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakePower.validate\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_37a6bdae","line":1822,"in_reply_to":"ba15a1d1_0b65b8df","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":1864,"context_line":"                          manager._validate_zap_steps,"},{"line_number":1865,"context_line":"                          zap_steps\u003dzap_step)"},{"line_number":1866,"context_line":""},{"line_number":1867,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_clean_step\u0027)"},{"line_number":1868,"context_line":"    def _do_next_clean_step_first_step_async(self, return_state, zap,"},{"line_number":1869,"context_line":"                                             mock_execute):"},{"line_number":1870,"context_line":"        # Execute the first async clean step on a node"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_ab636cdb","line":1867,"updated":"2015-09-16 07:50:53.000000000","message":"autospec\u003dTrue","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":1864,"context_line":"                          manager._validate_zap_steps,"},{"line_number":1865,"context_line":"                          zap_steps\u003dzap_step)"},{"line_number":1866,"context_line":""},{"line_number":1867,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.fake.FakeDeploy.execute_clean_step\u0027)"},{"line_number":1868,"context_line":"    def _do_next_clean_step_first_step_async(self, return_state, zap,"},{"line_number":1869,"context_line":"                                             mock_execute):"},{"line_number":1870,"context_line":"        # Execute the first async clean step on a node"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_d7e421e2","line":1867,"in_reply_to":"ba15a1d1_ab636cdb","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9c459e7bb925dce2cb9cc729593eb3ed7dd0b619","unresolved":false,"context_lines":[{"line_number":2271,"context_line":"    def test__prepare_cleaning(self):"},{"line_number":2272,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2273,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"},{"line_number":2274,"context_line":"            provision_state\u003dstates.CLEANING,"},{"line_number":2275,"context_line":"            target_provision_state\u003dstates.AVAILABLE,"},{"line_number":2276,"context_line":"            last_error\u003dNone,"},{"line_number":2277,"context_line":"            clean_step\u003dNone)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_baa9707d","line":2274,"updated":"2015-09-16 10:31:44.000000000","message":"Maybe also add a test case with provision_state\u003dZAPPING","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":2271,"context_line":"    def test__prepare_cleaning(self):"},{"line_number":2272,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":2273,"context_line":"            self.context, driver\u003d\u0027fake\u0027,"},{"line_number":2274,"context_line":"            provision_state\u003dstates.CLEANING,"},{"line_number":2275,"context_line":"            target_provision_state\u003dstates.AVAILABLE,"},{"line_number":2276,"context_line":"            last_error\u003dNone,"},{"line_number":2277,"context_line":"            clean_step\u003dNone)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_9701c96c","line":2274,"in_reply_to":"ba15a1d1_baa9707d","updated":"2015-09-16 22:00:37.000000000","message":"I don\u0027t think this adds any value. There\u0027s no conditional code paths.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"}],"ironic/tests/drivers/test_agent_base_vendor.py":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        kwargs \u003d {"},{"line_number":332,"context_line":"            \u0027agent_url\u0027: \u0027http://127.0.0.1:9999/bar\u0027"},{"line_number":333,"context_line":"        }"},{"line_number":334,"context_line":"        self.node.clean_step \u003d {}"},{"line_number":335,"context_line":"        for state in (states.CLEANWAIT, states.CLEANING, states.ZAPWAIT):"},{"line_number":336,"context_line":"            self.node.provision_state \u003d state"},{"line_number":337,"context_line":"            self.node.save()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_185bcc55","line":334,"updated":"2015-09-16 07:50:53.000000000","message":"Better to add\n\n  self.node.zap_step \u003d {}","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        kwargs \u003d {"},{"line_number":332,"context_line":"            \u0027agent_url\u0027: \u0027http://127.0.0.1:9999/bar\u0027"},{"line_number":333,"context_line":"        }"},{"line_number":334,"context_line":"        self.node.clean_step \u003d {}"},{"line_number":335,"context_line":"        for state in (states.CLEANWAIT, states.CLEANING, states.ZAPWAIT):"},{"line_number":336,"context_line":"            self.node.provision_state \u003d state"},{"line_number":337,"context_line":"            self.node.save()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_17737916","line":334,"in_reply_to":"ba15a1d1_185bcc55","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            \u0027interface\u0027: \u0027deploy\u0027,"},{"line_number":363,"context_line":"            \u0027step\u0027: \u0027foo\u0027,"},{"line_number":364,"context_line":"            \u0027reboot_requested\u0027: False"},{"line_number":365,"context_line":"        }"},{"line_number":366,"context_line":"        for state in (states.CLEANWAIT, states.CLEANING):"},{"line_number":367,"context_line":"            self.node.provision_state \u003d state"},{"line_number":368,"context_line":"            self.node.save()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_b859805c","line":365,"updated":"2015-09-16 07:50:53.000000000","message":"Need to add ZAPWAIT here as well.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            \u0027interface\u0027: \u0027deploy\u0027,"},{"line_number":363,"context_line":"            \u0027step\u0027: \u0027foo\u0027,"},{"line_number":364,"context_line":"            \u0027reboot_requested\u0027: False"},{"line_number":365,"context_line":"        }"},{"line_number":366,"context_line":"        for state in (states.CLEANWAIT, states.CLEANING):"},{"line_number":367,"context_line":"            self.node.provision_state \u003d state"},{"line_number":368,"context_line":"            self.node.save()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_37579d59","line":365,"in_reply_to":"ba15a1d1_b859805c","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"4a3b07a601517deb29f828b55a976d52395e325f","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        }"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        mock_continue.side_effect \u003d Exception()"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        for state in (states.CLEANWAIT, states.CLEANING):"},{"line_number":397,"context_line":"            self.node.provision_state \u003d state"},{"line_number":398,"context_line":"            self.node.save()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8b2a287d","line":395,"updated":"2015-09-16 07:50:53.000000000","message":"Need to add ZAPWAIT here.","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"fd949dcac4d9509382d777fc3d8e8e78bf54e5a7","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        }"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        mock_continue.side_effect \u003d Exception()"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        for state in (states.CLEANWAIT, states.CLEANING):"},{"line_number":397,"context_line":"            self.node.provision_state \u003d state"},{"line_number":398,"context_line":"            self.node.save()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_57549151","line":395,"in_reply_to":"ba15a1d1_8b2a287d","updated":"2015-09-16 22:00:37.000000000","message":"Done","commit_id":"83c8fba5153e64097e848b47b878ceae8a426a89"}]}
