)]}'
{"ironic/api/controllers/v1/ramdisk.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"cf5f3756b07c546306ed60697f789025023ce556","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                raise exception.Invalid("},{"line_number":194,"context_line":"                    _(\u0027Detected change in ramdisk provided \u0027"},{"line_number":195,"context_line":"                      \u0027\"callback_url\"\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        try:"},{"line_number":198,"context_line":"            topic \u003d api.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":199,"context_line":"        except exception.NoValidHost as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_89caa843","line":196,"updated":"2019-10-25 06:10:22.000000000","message":"Well, this relies the first heartbeat being a genuine one, I think this is good for now.\n\nIt\u0027s possible to validate possible URLs in range, as long as ironic has knowledge of the IP addresses assignment, the URL can be constructed, which is viable when integrated with neutron. May need more thinking when it\u0027s not the case.","commit_id":"41269f276e64a2dd31bc207da3378a158090ebc1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"70e20845e8dd070e362f45738b75b5f4d49d13e5","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                raise exception.Invalid("},{"line_number":194,"context_line":"                    _(\u0027Detected change in ramdisk provided \u0027"},{"line_number":195,"context_line":"                      \u0027\"callback_url\"\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        try:"},{"line_number":198,"context_line":"            topic \u003d api.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":199,"context_line":"        except exception.NoValidHost as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eed47a21","line":196,"in_reply_to":"3fa7e38b_89caa843","updated":"2019-10-25 13:02:29.000000000","message":"I\u0027m currently thinking of a key/token mechanism involving lookup to close the gap even further, but that will definitely be a separate patch and one I can\u0027t backport. This, I should be able to backport without issue :)","commit_id":"41269f276e64a2dd31bc207da3378a158090ebc1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"936d296c6b1254df8b45ed5336471be3261559c5","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        rpc_node \u003d api_utils.get_rpc_node_with_suffix(node_ident)"},{"line_number":187,"context_line":"        dii \u003d rpc_node[\u0027driver_internal_info\u0027]"},{"line_number":188,"context_line":"        agent_url \u003d dii.get(\u0027agent_url\u0027)"},{"line_number":189,"context_line":"        # If we have an agent_url on file, and we get something differnt"},{"line_number":190,"context_line":"        # we should fail becuase this is unexpected behavior of the agent."},{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_cf708775","line":189,"updated":"2019-10-28 09:24:00.000000000","message":"nit: different","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"89f02016167ccfbe4877ecdb3f820c3aa9760971","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        rpc_node \u003d api_utils.get_rpc_node_with_suffix(node_ident)"},{"line_number":187,"context_line":"        dii \u003d rpc_node[\u0027driver_internal_info\u0027]"},{"line_number":188,"context_line":"        agent_url \u003d dii.get(\u0027agent_url\u0027)"},{"line_number":189,"context_line":"        # If we have an agent_url on file, and we get something differnt"},{"line_number":190,"context_line":"        # we should fail becuase this is unexpected behavior of the agent."},{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_53cc27ba","line":189,"in_reply_to":"3fa7e38b_cf708775","updated":"2019-10-29 16:49:49.000000000","message":"Done","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"936d296c6b1254df8b45ed5336471be3261559c5","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        dii \u003d rpc_node[\u0027driver_internal_info\u0027]"},{"line_number":188,"context_line":"        agent_url \u003d dii.get(\u0027agent_url\u0027)"},{"line_number":189,"context_line":"        # If we have an agent_url on file, and we get something differnt"},{"line_number":190,"context_line":"        # we should fail becuase this is unexpected behavior of the agent."},{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                raise exception.Invalid("}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_6f69538a","line":190,"updated":"2019-10-28 09:24:00.000000000","message":"nit: because","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"89f02016167ccfbe4877ecdb3f820c3aa9760971","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        dii \u003d rpc_node[\u0027driver_internal_info\u0027]"},{"line_number":188,"context_line":"        agent_url \u003d dii.get(\u0027agent_url\u0027)"},{"line_number":189,"context_line":"        # If we have an agent_url on file, and we get something differnt"},{"line_number":190,"context_line":"        # we should fail becuase this is unexpected behavior of the agent."},{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                raise exception.Invalid("}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f3c43394","line":190,"in_reply_to":"3fa7e38b_6f69538a","updated":"2019-10-29 16:49:49.000000000","message":"Done","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a8b2f4c0f73bce785130d63bd5475d449e20b91f","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                raise exception.Invalid("},{"line_number":194,"context_line":"                    _(\u0027Detected change in ramdisk provided \u0027"},{"line_number":195,"context_line":"                      \u0027\"callback_url\"\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        try:"},{"line_number":198,"context_line":"            topic \u003d api.request.rpcapi.get_topic_for(rpc_node)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_7b8b51bf","line":195,"updated":"2019-10-28 14:57:43.000000000","message":"If it is a malicious user -- would it be useful to log the callback url (or maybe it is logged elsewhere...)","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"89f02016167ccfbe4877ecdb3f820c3aa9760971","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                raise exception.Invalid("},{"line_number":194,"context_line":"                    _(\u0027Detected change in ramdisk provided \u0027"},{"line_number":195,"context_line":"                      \u0027\"callback_url\"\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        try:"},{"line_number":198,"context_line":"            topic \u003d api.request.rpcapi.get_topic_for(rpc_node)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_13c22f86","line":195,"in_reply_to":"3fa7e38b_7b8b51bf","updated":"2019-10-29 16:49:49.000000000","message":"Done","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"9762daadb6641533ec5c7b8bedcc9b508bba6dd3","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                LOG.error(\u0027Received heartbeat for node %(node)s with \u0027"},{"line_number":194,"context_line":"                          \u0027callback URL %(url). This is not expected, \u0027"},{"line_number":195,"context_line":"                          \u0027and the heartbeat will not be processed.\u0027,"},{"line_number":196,"context_line":"                          {\u0027node\u0027: rpc_node.uuid, \u0027url\u0027, callback_url})"},{"line_number":197,"context_line":"                raise exception.Invalid("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_3ecb6b53","line":194,"range":{"start_line":194,"start_character":45,"end_line":194,"end_character":46},"updated":"2019-10-30 00:57:05.000000000","message":"missing a \u0027s\u0027","commit_id":"af842dadfd5483227635092677aac3cb3a538be7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"9762daadb6641533ec5c7b8bedcc9b508bba6dd3","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                LOG.error(\u0027Received heartbeat for node %(node)s with \u0027"},{"line_number":194,"context_line":"                          \u0027callback URL %(url). This is not expected, \u0027"},{"line_number":195,"context_line":"                          \u0027and the heartbeat will not be processed.\u0027,"},{"line_number":196,"context_line":"                          {\u0027node\u0027: rpc_node.uuid, \u0027url\u0027, callback_url})"},{"line_number":197,"context_line":"                raise exception.Invalid("},{"line_number":198,"context_line":"                    _(\u0027Detected change in ramdisk provided \u0027"},{"line_number":199,"context_line":"                      \u0027\"callback_url\"\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_5ec8a753","line":196,"range":{"start_line":196,"start_character":55,"end_line":196,"end_character":56},"updated":"2019-10-30 00:57:05.000000000","message":"s/,/:/","commit_id":"af842dadfd5483227635092677aac3cb3a538be7"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"a46221bf13a2cf0cc007949bafd5824fd85e6240","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        agent_url \u003d dii.get(\u0027agent_url\u0027)"},{"line_number":189,"context_line":"        # If we have an agent_url on file, and we get something different"},{"line_number":190,"context_line":"        # we should fail because this is unexpected behavior of the agent."},{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                LOG.error(\u0027Received heartbeat for node %(node)s with \u0027"},{"line_number":194,"context_line":"                          \u0027callback URL %(url)s. This is not expected, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_24d7b525","line":191,"updated":"2019-11-01 15:07:56.000000000","message":"Pardon my possibly silly question, is it a valid condition when `agent_url` is still not populated, but callback already happens?","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"e5ad0574f1b11ad339a57447f94bdf67a8abea3c","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        agent_url \u003d dii.get(\u0027agent_url\u0027)"},{"line_number":189,"context_line":"        # If we have an agent_url on file, and we get something different"},{"line_number":190,"context_line":"        # we should fail because this is unexpected behavior of the agent."},{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                LOG.error(\u0027Received heartbeat for node %(node)s with \u0027"},{"line_number":194,"context_line":"                          \u0027callback URL %(url)s. This is not expected, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_2f92d7fd","line":191,"in_reply_to":"3fa7e38b_24d7b525","updated":"2019-11-11 05:40:10.000000000","message":"Yep, it\u0027s a valid condition, agent_url will be recorded for on the first heartbeat. So the check here means you cannot change the agent_url during an operation.","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6acecbc3dd2d28dd551852a261cb185b46d9e877","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        agent_url \u003d dii.get(\u0027agent_url\u0027)"},{"line_number":189,"context_line":"        # If we have an agent_url on file, and we get something different"},{"line_number":190,"context_line":"        # we should fail because this is unexpected behavior of the agent."},{"line_number":191,"context_line":"        if (agent_url is not None"},{"line_number":192,"context_line":"            and agent_url !\u003d callback_url):"},{"line_number":193,"context_line":"                LOG.error(\u0027Received heartbeat for node %(node)s with \u0027"},{"line_number":194,"context_line":"                          \u0027callback URL %(url)s. This is not expected, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_0951c90e","line":191,"in_reply_to":"3fa7e38b_2f92d7fd","updated":"2019-11-15 22:07:57.000000000","message":"Which is what I\u0027m intending with this change.","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"}],"ironic/conductor/manager.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"cf5f3756b07c546306ed60697f789025023ce556","unresolved":false,"context_lines":[{"line_number":3993,"context_line":"    driver_internal_info.pop(\u0027deploy_step_index\u0027, None)"},{"line_number":3994,"context_line":"    driver_internal_info.pop(\u0027deployment_reboot\u0027, None)"},{"line_number":3995,"context_line":"    driver_internal_info.pop(\u0027deployment_polling\u0027, None)"},{"line_number":3996,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":3997,"context_line":"    node.save()"},{"line_number":3998,"context_line":""},{"line_number":3999,"context_line":"    _start_console_in_deploy(task)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_0c4ec695","line":3996,"updated":"2019-10-25 06:10:22.000000000","message":"Do we want to keep agent_url after deployment? If we do, then I think we need a pop() here.","commit_id":"41269f276e64a2dd31bc207da3378a158090ebc1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"06c3bc34f476c71dc708e2191650e65628e96905","unresolved":false,"context_lines":[{"line_number":3993,"context_line":"    driver_internal_info.pop(\u0027deploy_step_index\u0027, None)"},{"line_number":3994,"context_line":"    driver_internal_info.pop(\u0027deployment_reboot\u0027, None)"},{"line_number":3995,"context_line":"    driver_internal_info.pop(\u0027deployment_polling\u0027, None)"},{"line_number":3996,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":3997,"context_line":"    node.save()"},{"line_number":3998,"context_line":""},{"line_number":3999,"context_line":"    _start_console_in_deploy(task)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_9f5896fa","line":3996,"in_reply_to":"3fa7e38b_0c4ec695","updated":"2019-10-25 06:40:17.000000000","message":"uh, I mean \"If we don\u0027t\" :/","commit_id":"41269f276e64a2dd31bc207da3378a158090ebc1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"70e20845e8dd070e362f45738b75b5f4d49d13e5","unresolved":false,"context_lines":[{"line_number":3993,"context_line":"    driver_internal_info.pop(\u0027deploy_step_index\u0027, None)"},{"line_number":3994,"context_line":"    driver_internal_info.pop(\u0027deployment_reboot\u0027, None)"},{"line_number":3995,"context_line":"    driver_internal_info.pop(\u0027deployment_polling\u0027, None)"},{"line_number":3996,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":3997,"context_line":"    node.save()"},{"line_number":3998,"context_line":""},{"line_number":3999,"context_line":"    _start_console_in_deploy(task)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_2eea92d7","line":3996,"in_reply_to":"3fa7e38b_0c4ec695","updated":"2019-10-25 13:02:29.000000000","message":"unlikely, I\u0027ll fix.","commit_id":"41269f276e64a2dd31bc207da3378a158090ebc1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"70e20845e8dd070e362f45738b75b5f4d49d13e5","unresolved":false,"context_lines":[{"line_number":3993,"context_line":"    driver_internal_info.pop(\u0027deploy_step_index\u0027, None)"},{"line_number":3994,"context_line":"    driver_internal_info.pop(\u0027deployment_reboot\u0027, None)"},{"line_number":3995,"context_line":"    driver_internal_info.pop(\u0027deployment_polling\u0027, None)"},{"line_number":3996,"context_line":"    node.driver_internal_info \u003d driver_internal_info"},{"line_number":3997,"context_line":"    node.save()"},{"line_number":3998,"context_line":""},{"line_number":3999,"context_line":"    _start_console_in_deploy(task)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eea23aad","line":3996,"in_reply_to":"3fa7e38b_9f5896fa","updated":"2019-10-25 13:02:29.000000000","message":"The other reason I put the removals in the invocations of deployment/cleaning/etc was to catch those cases and reset the url\u0027s ability to be set to, so hopefully even if we miss it or if someone does something to take the node off the rails by touching the db directly, we still are able to perform a deployment.","commit_id":"41269f276e64a2dd31bc207da3378a158090ebc1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a8b2f4c0f73bce785130d63bd5475d449e20b91f","unresolved":false,"context_lines":[{"line_number":706,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027unrescuing\u0027),"},{"line_number":707,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":708,"context_line":"            try:"},{"line_number":709,"context_line":"                task.driver.power.validate(task)"},{"line_number":710,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":711,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":712,"context_line":"                raise exception.InstanceUnrescueFailure("}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_db0fe536","line":709,"updated":"2019-10-28 14:57:43.000000000","message":"I can\u0027t recall, but do we need to explicitly do a node.save() before we call this? If we don\u0027t, I wonder if things might get out-of-sync. Maybe a .validate() doesn\u0027t modify the node so it is OK.\n\nHowever, I see below, we then do task.process_event(). We ought to save the node before then I think.","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"df3ebbb240627fdf1e95a296421e0c388d2b9c77","unresolved":false,"context_lines":[{"line_number":706,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027unrescuing\u0027),"},{"line_number":707,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":708,"context_line":"            try:"},{"line_number":709,"context_line":"                task.driver.power.validate(task)"},{"line_number":710,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":711,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":712,"context_line":"                raise exception.InstanceUnrescueFailure("}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_53e747e4","line":709,"in_reply_to":"3fa7e38b_53418709","updated":"2019-10-29 17:04:26.000000000","message":"thx for clarifying!","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"89f02016167ccfbe4877ecdb3f820c3aa9760971","unresolved":false,"context_lines":[{"line_number":706,"context_line":"                raise exception.NodeInMaintenance(op\u003d_(\u0027unrescuing\u0027),"},{"line_number":707,"context_line":"                                                  node\u003dnode.uuid)"},{"line_number":708,"context_line":"            try:"},{"line_number":709,"context_line":"                task.driver.power.validate(task)"},{"line_number":710,"context_line":"            except (exception.InvalidParameterValue,"},{"line_number":711,"context_line":"                    exception.MissingParameterValue) as e:"},{"line_number":712,"context_line":"                raise exception.InstanceUnrescueFailure("}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_53418709","line":709,"in_reply_to":"3fa7e38b_db0fe536","updated":"2019-10-29 16:49:49.000000000","message":"We don\u0027t need to afaik. The task is an object that is just being referenced and passed through. node \u003d task.node is just a like a label mapping more than anything else. In this case process_event calls save for us if the FSM state transition is valid.","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"}],"ironic/conductor/utils.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"a46221bf13a2cf0cc007949bafd5824fd85e6240","unresolved":false,"context_lines":[{"line_number":527,"context_line":"    try:"},{"line_number":528,"context_line":"        node_power_action(task, states.POWER_OFF)"},{"line_number":529,"context_line":"        task.driver.rescue.clean_up(task)"},{"line_number":530,"context_line":"        remove_agent_url(node)"},{"line_number":531,"context_line":"        node.last_error \u003d msg"},{"line_number":532,"context_line":"    except exception.IronicException as e:"},{"line_number":533,"context_line":"        node.last_error \u003d (_(\u0027Rescue operation was unsuccessful, clean up \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_64fa8dba","line":530,"updated":"2019-11-01 15:07:56.000000000","message":"This line might not be executed if any of the above throw.","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"e5ad0574f1b11ad339a57447f94bdf67a8abea3c","unresolved":false,"context_lines":[{"line_number":527,"context_line":"    try:"},{"line_number":528,"context_line":"        node_power_action(task, states.POWER_OFF)"},{"line_number":529,"context_line":"        task.driver.rescue.clean_up(task)"},{"line_number":530,"context_line":"        remove_agent_url(node)"},{"line_number":531,"context_line":"        node.last_error \u003d msg"},{"line_number":532,"context_line":"    except exception.IronicException as e:"},{"line_number":533,"context_line":"        node.last_error \u003d (_(\u0027Rescue operation was unsuccessful, clean up \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_0fa11b47","line":530,"in_reply_to":"3fa7e38b_64fa8dba","updated":"2019-11-11 05:40:10.000000000","message":"Good point, a fairly light op above but it could happen though, seems reasonable to move down to L545.","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"175d61336a9bf0daa131534e0d22848dc10861ce","unresolved":false,"context_lines":[{"line_number":926,"context_line":"    \"\"\"Helper to remove the agent_url record.\"\"\""},{"line_number":927,"context_line":"    info \u003d node.driver_internal_info"},{"line_number":928,"context_line":"    info.pop(\u0027agent_url\u0027, None)"},{"line_number":929,"context_line":"    node.driver_internal_info \u003d info"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_7e1baa1b","line":929,"updated":"2019-11-08 12:44:28.000000000","message":"Should we save the node\u0027s state after the removal of agent_url?","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6acecbc3dd2d28dd551852a261cb185b46d9e877","unresolved":false,"context_lines":[{"line_number":926,"context_line":"    \"\"\"Helper to remove the agent_url record.\"\"\""},{"line_number":927,"context_line":"    info \u003d node.driver_internal_info"},{"line_number":928,"context_line":"    info.pop(\u0027agent_url\u0027, None)"},{"line_number":929,"context_line":"    node.driver_internal_info \u003d info"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_893cd9bf","line":929,"in_reply_to":"3fa7e38b_0fba7b6d","updated":"2019-11-15 22:07:57.000000000","message":"The extra save would also tax the DB, I\u0027d prefer to keep those sorts of things fairly explicit along the workflow to only where they make absolute sense and along the end of operations. Mid-stream in clean-up right before most operations end up saving would degrade db performance.","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"e5ad0574f1b11ad339a57447f94bdf67a8abea3c","unresolved":false,"context_lines":[{"line_number":926,"context_line":"    \"\"\"Helper to remove the agent_url record.\"\"\""},{"line_number":927,"context_line":"    info \u003d node.driver_internal_info"},{"line_number":928,"context_line":"    info.pop(\u0027agent_url\u0027, None)"},{"line_number":929,"context_line":"    node.driver_internal_info \u003d info"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_0fba7b6d","line":929,"in_reply_to":"3fa7e38b_7e1baa1b","updated":"2019-11-11 05:40:10.000000000","message":"It\u0027s a helper method that we\u0027ll use before node.save, so there is no need to do extra save here.","commit_id":"b27f32052fe5bddfd1327b46149aa91a23fb06b7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b5fc661fcf5e6d42f2e8d9757cad1c2e399774e7","unresolved":false,"context_lines":[{"line_number":527,"context_line":"    try:"},{"line_number":528,"context_line":"        node_power_action(task, states.POWER_OFF)"},{"line_number":529,"context_line":"        task.driver.rescue.clean_up(task)"},{"line_number":530,"context_line":"        remove_agent_url(node)"},{"line_number":531,"context_line":"        node.last_error \u003d msg"},{"line_number":532,"context_line":"    except exception.IronicException as e:"},{"line_number":533,"context_line":"        node.last_error \u003d (_(\u0027Rescue operation was unsuccessful, clean up \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_3bc40860","line":530,"range":{"start_line":530,"start_character":8,"end_line":530,"end_character":30},"updated":"2019-11-16 01:56:20.000000000","message":"nit: not required","commit_id":"931c12598296dad676b2d64b66fef6e95ad3939b"}],"releasenotes/notes/prevent-callback-url-from-being-updated-41d50b20fb236e82.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a8b2f4c0f73bce785130d63bd5475d449e20b91f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"security:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Prvents additional updates of an agent ``callback_url`` through the agent"},{"line_number":5,"context_line":"    heartbeat ``/v1/heartbeat/\u003cnode_uuid\u003e`` endpoint as the ``callback_url``"},{"line_number":6,"context_line":"    should remain stable through the cleaning, provisioning, or rescue"},{"line_number":7,"context_line":"    processes. More information can be found at"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_0d054410","line":4,"updated":"2019-10-28 14:57:43.000000000","message":"nit s/Prvents/Prevents/","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"89f02016167ccfbe4877ecdb3f820c3aa9760971","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"security:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Prvents additional updates of an agent ``callback_url`` through the agent"},{"line_number":5,"context_line":"    heartbeat ``/v1/heartbeat/\u003cnode_uuid\u003e`` endpoint as the ``callback_url``"},{"line_number":6,"context_line":"    should remain stable through the cleaning, provisioning, or rescue"},{"line_number":7,"context_line":"    processes. More information can be found at"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_93329fa6","line":4,"in_reply_to":"3fa7e38b_0d054410","updated":"2019-10-29 16:49:49.000000000","message":"Done","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a8b2f4c0f73bce785130d63bd5475d449e20b91f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Prvents additional updates of an agent ``callback_url`` through the agent"},{"line_number":5,"context_line":"    heartbeat ``/v1/heartbeat/\u003cnode_uuid\u003e`` endpoint as the ``callback_url``"},{"line_number":6,"context_line":"    should remain stable through the cleaning, provisioning, or rescue"},{"line_number":7,"context_line":"    processes. More information can be found at"},{"line_number":8,"context_line":"    `story 2006773 \u003chttps://storyboard.openstack.org/#!/story/2006773\u003e`_."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_4d76dca6","line":7,"updated":"2019-10-28 14:57:43.000000000","message":"This doesn\u0027t explain what is being addressed (not to me anyway). but I guess it is ok for others.\n\neg What does \u0027additional updates\u0027 mean? The agent will heartbeat more than once, are the subsequent ones considered additional updates?","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"89f02016167ccfbe4877ecdb3f820c3aa9760971","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Prvents additional updates of an agent ``callback_url`` through the agent"},{"line_number":5,"context_line":"    heartbeat ``/v1/heartbeat/\u003cnode_uuid\u003e`` endpoint as the ``callback_url``"},{"line_number":6,"context_line":"    should remain stable through the cleaning, provisioning, or rescue"},{"line_number":7,"context_line":"    processes. More information can be found at"},{"line_number":8,"context_line":"    `story 2006773 \u003chttps://storyboard.openstack.org/#!/story/2006773\u003e`_."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_3323ab5a","line":7,"in_reply_to":"3fa7e38b_4d76dca6","updated":"2019-10-29 16:49:49.000000000","message":"Revised release note.","commit_id":"d6ede99a4b0d4343430b48816ef1a0a43b6abede"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"df3ebbb240627fdf1e95a296421e0c388d2b9c77","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Prevents additional updates of an agent ``callback_url`` through the agent"},{"line_number":5,"context_line":"    heartbeat ``/v1/heartbeat/\u003cnode_uuid\u003e`` endpoint as the ``callback_url``"},{"line_number":6,"context_line":"    should remain stable through the cleaning, provisioning, or rescue"},{"line_number":7,"context_line":"    processes. Should anything such as an unexpected agent reboot casue the"},{"line_number":8,"context_line":"    ``callback_url``, heartbeat operations will now be ignored."},{"line_number":9,"context_line":"    More information can be found at"},{"line_number":10,"context_line":"    `story 2006773 \u003chttps://storyboard.openstack.org/#!/story/2006773\u003e`_."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3fa7e38b_1369cf23","line":7,"updated":"2019-10-29 17:04:26.000000000","message":"nit s/casue/cause/","commit_id":"d327c052c4ee26fe317f7b243b3b4ffbd07cb886"}]}
