)]}'
{"specs/approved/error-log-history.rst":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e4a767109f8368b982955643a27ea83fff468cfa","unresolved":false,"context_lines":[{"line_number":32,"context_line":"recorded:"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"#. a node is entering maintenance mode due to power synchronization failure."},{"line_number":35,"context_line":"#. a node is leaving maintenance mode due to automatic power recovery."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Other events can be implemented base on this feature in the future, but it\u0027s"},{"line_number":38,"context_line":"out of scope of this spec. Generally, a node is entering to, or recovering from"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_c53bcece","line":35,"updated":"2019-04-16 04:47:37.000000000","message":"So I read the problem description last out of habit, which might explain some of my comments.  I feel like we ought to also try and cover or collect information about deployment failures, or make it such that we can rapidly add it since users are going to quickly expect that they can discovery more information about failures without digging through conductor logs.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"01f071f0ba9f7bcb8c9c6dff14e2013f4644d7d2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"recorded:"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"#. a node is entering maintenance mode due to power synchronization failure."},{"line_number":35,"context_line":"#. a node is leaving maintenance mode due to automatic power recovery."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Other events can be implemented base on this feature in the future, but it\u0027s"},{"line_number":38,"context_line":"out of scope of this spec. Generally, a node is entering to, or recovering from"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_20371de6","line":35,"in_reply_to":"3fce034c_0b0ec78c","updated":"2019-04-16 08:37:37.000000000","message":"\u003e easy in some deployments due to security reasons.\n\nerh, not easy (at all)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f2ba56ff4828eceea694f39e66cab8a8ef9bcb49","unresolved":false,"context_lines":[{"line_number":32,"context_line":"recorded:"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"#. a node is entering maintenance mode due to power synchronization failure."},{"line_number":35,"context_line":"#. a node is leaving maintenance mode due to automatic power recovery."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Other events can be implemented base on this feature in the future, but it\u0027s"},{"line_number":38,"context_line":"out of scope of this spec. Generally, a node is entering to, or recovering from"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_0b0ec78c","line":35,"in_reply_to":"3fce034c_c53bcece","updated":"2019-04-16 08:35:54.000000000","message":"Indeed, the spec is trying to get a code base for more error events logged. The general idea is having a log when the last_error is changed. Like you said, if we can identify an issue from api level, then we have no need to login into the conductor host, and it\u0027s easy in some deployments due to security reasons.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"16a677ce730db33299a4ee11c6356756552653b1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"#. a node is entering maintenance mode due to power synchronization failure."},{"line_number":35,"context_line":"#. a node is leaving maintenance mode due to automatic power recovery."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Other events can be implemented base on this feature in the future, but it\u0027s"},{"line_number":38,"context_line":"out of scope of this spec. Generally, a node is entering to, or recovering from"},{"line_number":39,"context_line":"a failed state could be candidates of error events."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_2b9cb85b","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":36},"updated":"2020-06-23 08:19:24.000000000","message":"nit: based","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"16a677ce730db33299a4ee11c6356756552653b1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Proposed change"},{"line_number":43,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Introduces a new table named ``histories`` and db object ``History``, see"},{"line_number":46,"context_line":"`Data model impact`_ for the schema definition."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Implements API layer to support error history query and delete. The history is"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_cbd89c1f","line":45,"range":{"start_line":45,"start_character":31,"end_line":45,"end_character":40},"updated":"2020-06-23 08:19:24.000000000","message":"nit: history ? or node_history as suggested by Dmitry","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"ab619ae810ca50cda0a5c435fcbf129e2d4c6d25","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Proposed change"},{"line_number":43,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Introduces a new table named ``histories`` and db object ``History``, see"},{"line_number":46,"context_line":"`Data model impact`_ for the schema definition."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Implements API layer to support error history query and delete. The history is"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_e26613ed","line":45,"range":{"start_line":45,"start_character":31,"end_line":45,"end_character":40},"in_reply_to":"bf51134e_cbd89c1f","updated":"2020-06-27 16:01:55.000000000","message":"Initial thought was our table names are all plural, node_history sounds good to me.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"`Data model impact`_ for the schema definition."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Implements API layer to support error history query and delete. The history is"},{"line_number":49,"context_line":"not supposed to accept Creat or Update from API requests."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Introduces a periodic task to remove error logs which exceed specified time."},{"line_number":52,"context_line":"The time is configurable by configuration options."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_f6cf9b7c","line":49,"updated":"2019-04-16 10:20:18.000000000","message":"nit: Create (and also delete)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"A new database table will be added with following schema::"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    op.create_table(\u0027histories\u0027,"},{"line_number":65,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":66,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_16cb4772","line":64,"updated":"2019-04-16 10:20:18.000000000","message":"nit: I think you mean singular \"history\" or even better \"node_history\"","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    op.create_table(\u0027histories\u0027,"},{"line_number":65,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":66,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":68,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":69,"context_line":"                    sa.Column(\u0027type\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_b6c91379","line":66,"updated":"2019-04-16 10:20:18.000000000","message":"nit: we don\u0027t need updated_at for something that is not going to be updated..","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"71b2e34f5e18ee495df84b53a02f285c7edd65d5","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    op.create_table(\u0027histories\u0027,"},{"line_number":65,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":66,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":68,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":69,"context_line":"                    sa.Column(\u0027type\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_7dbaa4c0","line":66,"in_reply_to":"3fce034c_b6c91379","updated":"2020-06-28 06:53:01.000000000","message":"yes, we don\u0027t need it, but it\u0027s implemented in our base object mixin, so we have to accept that except we want to do something fancy :)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"16a677ce730db33299a4ee11c6356756552653b1","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":66,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":68,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":69,"context_line":"                    sa.Column(\u0027type\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":70,"context_line":"                    sa.Column(\u0027reason\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027message\u0027, sa.Text(), nullable\u003dTrue),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_abee08b1","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":75},"updated":"2020-06-23 08:19:24.000000000","message":"I think uuid should not be nullable as it\u0027s a constraint? or anyway maybe we shouldn\u0027t allow to be nullable","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"ab619ae810ca50cda0a5c435fcbf129e2d4c6d25","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":66,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":68,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":69,"context_line":"                    sa.Column(\u0027type\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":70,"context_line":"                    sa.Column(\u0027reason\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027message\u0027, sa.Text(), nullable\u003dTrue),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_829d97bd","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":75},"in_reply_to":"bf51134e_abee08b1","updated":"2020-06-27 16:01:55.000000000","message":"Right, it should not be nullable.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e4a767109f8368b982955643a27ea83fff468cfa","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"``type`` is a string that defines the type of the message, can be ``error`` or"},{"line_number":80,"context_line":"``recovery``."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"``reason`` is a string that contains brief information on the error."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_2a49418a","line":80,"updated":"2019-04-16 04:47:37.000000000","message":"I\u0027ve not really read too deep, but wouldn\u0027t it make sense to capture severity and consider that as type?\n\nAnd how do we know what a recovery is? I guess I should read on :)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f2ba56ff4828eceea694f39e66cab8a8ef9bcb49","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"``type`` is a string that defines the type of the message, can be ``error`` or"},{"line_number":80,"context_line":"``recovery``."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"``reason`` is a string that contains brief information on the error."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_ddfde2b1","line":80,"in_reply_to":"3fce034c_2a49418a","updated":"2019-04-16 08:35:54.000000000","message":"Type is a classification on logs, because the assumption is that an error log is created only when a node is entering into a failed state or maintenance (not manually), which prevents node from available resource pools, in such case I guess there is no need to have a severity because they are all critical.\n\nAs to recovery, I think only power recovery could have recovery log, not sure if we should record recovery by operators.\n\nlast_errors can be cleared, but we still have some running history. This is the case I thought about, but I am open for more ideas.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"ab619ae810ca50cda0a5c435fcbf129e2d4c6d25","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"``type`` is a string that defines the type of the message, can be ``error`` or"},{"line_number":80,"context_line":"``recovery``."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"``reason`` is a string that contains brief information on the error."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_e2abb3d2","line":80,"in_reply_to":"3fce034c_ddfde2b1","updated":"2020-06-27 16:01:55.000000000","message":"I need to revise the table columes, currently I am thinkg removing the type field, it doesn\u0027t appear useful as it looks like as an initial proposal, it\u0027s because we don\u0027t want to turn the database into a journal, so we need to be cautious to have only crucial stuffs in :)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e4a767109f8368b982955643a27ea83fff468cfa","unresolved":false,"context_lines":[{"line_number":79,"context_line":"``type`` is a string that defines the type of the message, can be ``error`` or"},{"line_number":80,"context_line":"``recovery``."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"``reason`` is a string that contains brief information on the error."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"``message`` contains the full information on this event."},{"line_number":85,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_ea1fb96d","line":82,"updated":"2019-04-16 04:47:37.000000000","message":"I\u0027m not sure I understand the reason behind reason. It might help to understand how we\u0027re going to implement this under the hood of ironic. It feels like we could just wrap logging in key locations and write to the log and database where pertinent?","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f2ba56ff4828eceea694f39e66cab8a8ef9bcb49","unresolved":false,"context_lines":[{"line_number":79,"context_line":"``type`` is a string that defines the type of the message, can be ``error`` or"},{"line_number":80,"context_line":"``recovery``."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"``reason`` is a string that contains brief information on the error."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"``message`` contains the full information on this event."},{"line_number":85,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_eb67bb50","line":82,"in_reply_to":"3fce034c_ea1fb96d","updated":"2019-04-16 08:35:54.000000000","message":"The only reason to introduce a reason is to reduce the overhead of API, as the message could be long :) I thought about text truncating though but don\u0027t feel better.\nProbably renaming to \"action\" would make sense here, e.g., \"power synchronization\", \"node inspection\", something like that.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"  * Retrieve the list of logs. By default ``node``, ``type``, ``reason``"},{"line_number":102,"context_line":"    and ``created_at`` are returned. Detailed history log will be returned if"},{"line_number":103,"context_line":"    ``detail`` is set to True."},{"line_number":104,"context_line":"  * For a normal request, 200 is returned."},{"line_number":105,"context_line":"  * If ``node\u003d\u003cnode\u003e`` is specified in the query string, only logs belong to"},{"line_number":106,"context_line":"    the specified node is returned."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_d6c4df61","line":103,"updated":"2019-04-16 10:20:18.000000000","message":"Let\u0027s truncate this list to some sane value by default, you certainly don\u0027t want to return 100 records for 1000 nodes in one response. Also, usually we order by ID by default, but I guess this list will be ordered by created_at by default?","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"ab619ae810ca50cda0a5c435fcbf129e2d4c6d25","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"  * Retrieve the list of logs. By default ``node``, ``type``, ``reason``"},{"line_number":102,"context_line":"    and ``created_at`` are returned. Detailed history log will be returned if"},{"line_number":103,"context_line":"    ``detail`` is set to True."},{"line_number":104,"context_line":"  * For a normal request, 200 is returned."},{"line_number":105,"context_line":"  * If ``node\u003d\u003cnode\u003e`` is specified in the query string, only logs belong to"},{"line_number":106,"context_line":"    the specified node is returned."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_22b2cb49","line":103,"in_reply_to":"3fce034c_d6c4df61","updated":"2020-06-27 16:01:55.000000000","message":"it\u0027s very reasonable to truncate, in the meantime I am thinking a framework that at some time later we may have other backends which have a looser storage limit.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    ``detail`` is set to True."},{"line_number":104,"context_line":"  * For a normal request, 200 is returned."},{"line_number":105,"context_line":"  * If ``node\u003d\u003cnode\u003e`` is specified in the query string, only logs belong to"},{"line_number":106,"context_line":"    the specified node is returned."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* GET /v1/history/{uuid}"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_76a16ba9","line":106,"updated":"2019-04-16 10:20:18.000000000","message":"I\u0027m pretty sure you want to allow filtering by type and reason","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* DELETE /v1/history/{uuid}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"  * Delete a history log"},{"line_number":116,"context_line":"  * For a normal request, 200 is returned."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Client (CLI) impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_96a417bb","line":115,"updated":"2019-04-16 10:20:18.000000000","message":"What\u0027s the use case for this operation?","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6f087a0374d85390fdd76d38f3c9ebae9e8d9c2b","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* DELETE /v1/history/{uuid}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"  * Delete a history log"},{"line_number":116,"context_line":"  * For a normal request, 200 is returned."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Client (CLI) impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ffb9cba7_8382cdc7","line":115,"in_reply_to":"3fce034c_96a417bb","updated":"2019-04-23 09:52:30.000000000","message":"Users don\u0027t like errors there, once we have recovered a node, we want to remove it from the history. okay.. I suspect it can be called history then, maybe modified history :)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"ab619ae810ca50cda0a5c435fcbf129e2d4c6d25","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* DELETE /v1/history/{uuid}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"  * Delete a history log"},{"line_number":116,"context_line":"  * For a normal request, 200 is returned."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Client (CLI) impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_c27caf73","line":115,"in_reply_to":"ffb9cba7_8382cdc7","updated":"2020-06-27 16:01:55.000000000","message":"Will remove this, history will be cleaned up in periodic tasks, just for sparing space.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":113,"context_line":"* DELETE /v1/history/{uuid}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"  * Delete a history log"},{"line_number":116,"context_line":"  * For a normal request, 200 is returned."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Client (CLI) impact"},{"line_number":119,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_36abe389","line":116,"updated":"2019-04-16 10:20:18.000000000","message":"204 (HTTP No Content)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"OSC will be enhanced to support following operations:"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"* ``openstack baremetal history list``: list all histories"},{"line_number":132,"context_line":"* ``openstack baremetal history delete \u003cuuid\u003e``: delete a specified history log"},{"line_number":133,"context_line":"* ``openstack baremetal history list --node \u003cnode\u003e``: list histories for"},{"line_number":134,"context_line":"  specified node."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_56aeaf98","line":131,"updated":"2019-04-16 10:20:18.000000000","message":"Thinking more about it, what\u0027s the use case of listing history without a node?","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e4a767109f8368b982955643a27ea83fff468cfa","unresolved":false,"context_lines":[{"line_number":156,"context_line":"Security impact"},{"line_number":157,"context_line":"---------------"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"None"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Other end user impact"},{"line_number":162,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_05579604","line":159,"updated":"2019-04-16 04:47:37.000000000","message":"So if we start logging extra data in such an interface, don\u0027t we increase our risk of exposing anything sensitive?","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f2ba56ff4828eceea694f39e66cab8a8ef9bcb49","unresolved":false,"context_lines":[{"line_number":156,"context_line":"Security impact"},{"line_number":157,"context_line":"---------------"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"None"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Other end user impact"},{"line_number":162,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_4bf04f68","line":159,"in_reply_to":"3fce034c_05579604","updated":"2019-04-16 08:35:54.000000000","message":"I don\u0027t expect to expose any thing more than our last_error records, since last_error is already exposed to users, so I think there is no extra security considerations.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e4a767109f8368b982955643a27ea83fff468cfa","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* ``[conductor]history_ttl``: how long in days, ironic should keep an error"},{"line_number":184,"context_line":"  log. If the create time for an error log exceeds specified ttl, it will"},{"line_number":185,"context_line":"  be removed. The default value is 7 days. Set to 0 will disable this feature."},{"line_number":186,"context_line":"* ``[conductor]history_cleanup_interval``: the interval in seconds, the"},{"line_number":187,"context_line":"  periodic task should be scheduled. One day by default. Set to 0 will disable"},{"line_number":188,"context_line":"  error log clean up."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_45603ea6","line":185,"updated":"2019-04-16 04:47:37.000000000","message":"Just thinking through the numbers, because I suspect this should be seconds.\n\nAt the scale of 100,000 nodes, say 15% encounter a transitory issue a day, 15,000 nodes... two entires per node, 30,000 events...\n\n30,000 events\n\n((4 * 2 Bytes) + ( 36 +1 Bytes) + 4 Bytes + (estimating 64+1 Bytes) + (estimating 32 + 1 Bytes) + (1k + 2 Bytes)+ 4 Bytes (I think that is what ends up in memory for text fields))\n\n1177 Bytes per record\n\n 30,000 nodes * 1177 Bytes * 7 days \u003d 247,170,000 bytes on disk in a memory mapped file...\n... which means if the memory pressure is strong enough it will start reading blocks into the cache per node.\n\nThat seems like a performance/memory impact for the large scale operators.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9476894d5fd3cea67b3eeb07a694e8cfd8381d4d","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* ``[conductor]history_ttl``: how long in days, ironic should keep an error"},{"line_number":184,"context_line":"  log. If the create time for an error log exceeds specified ttl, it will"},{"line_number":185,"context_line":"  be removed. The default value is 7 days. Set to 0 will disable this feature."},{"line_number":186,"context_line":"* ``[conductor]history_cleanup_interval``: the interval in seconds, the"},{"line_number":187,"context_line":"  periodic task should be scheduled. One day by default. Set to 0 will disable"},{"line_number":188,"context_line":"  error log clean up."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_f6947b46","line":185,"updated":"2019-04-16 10:20:18.000000000","message":"Let\u0027s also think if RDBMS like MySQL is actually a good for this kind of data. In my past we kept this stuff in Redis, which has built-in TTL (without vacuuming issues on bulk-deletion). Of course it wouldn\u0027t be wise to keep the whole messages in Redis, but.. maybe we don\u0027t need to? After all, that\u0027s what logs are for?\n\nMaybe we could provide only the base clues for the operators, like \"Yesterday at 14:15 UTC a power fault happened and got recovered at 14:45\". Then they can dive into whatever tool for logs crunching they have to see more context. After all, there specialized solutions for that, maybe we shouldn\u0027t duplicate their job?\n\nAnd thinking more about that, shouldn\u0027t we rely on some 3rd party solutions for the whole feature? In the same past we used Redis like that: for quick overview of recent events. Then we could dive into a specialized tool.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f2ba56ff4828eceea694f39e66cab8a8ef9bcb49","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* ``[conductor]history_ttl``: how long in days, ironic should keep an error"},{"line_number":184,"context_line":"  log. If the create time for an error log exceeds specified ttl, it will"},{"line_number":185,"context_line":"  be removed. The default value is 7 days. Set to 0 will disable this feature."},{"line_number":186,"context_line":"* ``[conductor]history_cleanup_interval``: the interval in seconds, the"},{"line_number":187,"context_line":"  periodic task should be scheduled. One day by default. Set to 0 will disable"},{"line_number":188,"context_line":"  error log clean up."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_fd121e58","line":185,"in_reply_to":"3fce034c_45603ea6","updated":"2019-04-16 08:35:54.000000000","message":"\u003e Just thinking through the numbers, because I suspect this should be\n \u003e seconds.\n\nTypically we keep records for a week, that\u0027s how 7 days come into play. I don\u0027t think this feature would make sense for keeping such a short period. A node fails and when we check its history, I can\u0027t imagine it\u0027s gone \\o/\n\n \u003e At the scale of 100,000 nodes, say 15% encounter a transitory issue\n \u003e a day, 15,000 nodes... two entires per node, 30,000 events...\n \u003e \n \u003e 30,000 events\n \u003e \n \u003e ((4 * 2 Bytes) + ( 36 +1 Bytes) + 4 Bytes + (estimating 64+1 Bytes)\n \u003e + (estimating 32 + 1 Bytes) + (1k + 2 Bytes)+ 4 Bytes (I think that\n \u003e is what ends up in memory for text fields))\n \u003e \n \u003e 1177 Bytes per record\n \u003e \n\nOooh horrible numbers, I can\u0027t do arithmetic *facepalm*\n\n \u003e 30,000 nodes * 1177 Bytes * 7 days \u003d 247,170,000 bytes on disk in a\n \u003e memory mapped file...\n \u003e ... which means if the memory pressure is strong enough it will\n \u003e start reading blocks into the cache per node.\n \u003e \n \u003e That seems like a performance/memory impact for the large scale\n \u003e operators.\n\nBut I get your point, I haven\u0027t expected such a scale or frequency, but I think we could put a size limit on the message. Though the message is text type, but I don\u0027t think it could be very large, it just doesn\u0027t fit into 255 characters :)","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6f087a0374d85390fdd76d38f3c9ebae9e8d9c2b","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* ``[conductor]history_ttl``: how long in days, ironic should keep an error"},{"line_number":184,"context_line":"  log. If the create time for an error log exceeds specified ttl, it will"},{"line_number":185,"context_line":"  be removed. The default value is 7 days. Set to 0 will disable this feature."},{"line_number":186,"context_line":"* ``[conductor]history_cleanup_interval``: the interval in seconds, the"},{"line_number":187,"context_line":"  periodic task should be scheduled. One day by default. Set to 0 will disable"},{"line_number":188,"context_line":"  error log clean up."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ffb9cba7_03f33da0","line":185,"in_reply_to":"3fce034c_f6947b46","updated":"2019-04-23 09:52:30.000000000","message":"\u003e Let\u0027s also think if RDBMS like MySQL is actually a good for this\n \u003e kind of data. In my past we kept this stuff in Redis, which has\n \u003e built-in TTL (without vacuuming issues on bulk-deletion). Of course\n \u003e it wouldn\u0027t be wise to keep the whole messages in Redis, but..\n \u003e maybe we don\u0027t need to? After all, that\u0027s what logs are for?\n\nI have no experience on Redis, but it seems it\u0027s a in-memory cache without persistent backend, I feel there is a possibility to use services like etcd, nut none of them are supported service in my case.\n\n \u003e Maybe we could provide only the base clues for the operators, like\n \u003e \"Yesterday at 14:15 UTC a power fault happened and got recovered at\n \u003e 14:45\". Then they can dive into whatever tool for logs crunching\n \u003e they have to see more context. After all, there specialized\n \u003e solutions for that, maybe we shouldn\u0027t duplicate their job?\n\nThis reminds me the original fault feature proposed by JayF, it seems introducing complexity, as we need to match records.\n\n \u003e And thinking more about that, shouldn\u0027t we rely on some 3rd party\n \u003e solutions for the whole feature? In the same past we used Redis\n \u003e like that: for quick overview of recent events. Then we could dive\n \u003e into a specialized tool.\n\nI think it\u0027s a possible move, the purpose of this spec is to have more knowledge on the status of the node in a period. Without full error log I hope we can have some accurate pointers that really helps for an issue.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e4a767109f8368b982955643a27ea83fff468cfa","unresolved":false,"context_lines":[{"line_number":186,"context_line":"* ``[conductor]history_cleanup_interval``: the interval in seconds, the"},{"line_number":187,"context_line":"  periodic task should be scheduled. One day by default. Set to 0 will disable"},{"line_number":188,"context_line":"  error log clean up."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"Developer impact"},{"line_number":191,"context_line":"----------------"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_8a59555b","line":189,"updated":"2019-04-16 04:47:37.000000000","message":"Out of curiosity, what about environments where bare metal nodes are rolled over often?","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f2ba56ff4828eceea694f39e66cab8a8ef9bcb49","unresolved":false,"context_lines":[{"line_number":186,"context_line":"* ``[conductor]history_cleanup_interval``: the interval in seconds, the"},{"line_number":187,"context_line":"  periodic task should be scheduled. One day by default. Set to 0 will disable"},{"line_number":188,"context_line":"  error log clean up."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"Developer impact"},{"line_number":191,"context_line":"----------------"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fce034c_9d50ba0c","line":189,"in_reply_to":"3fce034c_8a59555b","updated":"2019-04-16 08:35:54.000000000","message":"Does rolled over mean deleted then enrolled? Associated logs will be removed when a node is deleted.","commit_id":"e4fd0b3484ffab6980645a9021cfb2007645f3a0"}],"specs/approved/node-history.rst":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2465d92a467a386784497e9f031ea1a4a7c223d5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"identifying issues."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"},{"line_number":18,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Currently ironic uses one last_error field to record error information when"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_b10ab41c","line":17,"updated":"2020-08-07 17:34:09.000000000","message":"this was always a gap in the implementation of \u0027last_error\u0027 that I had intended to fill, but did not prioritize.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2465d92a467a386784497e9f031ea1a4a7c223d5","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  change."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"The range could be extended according to requirements in the future, but not"},{"line_number":46,"context_line":"included in this spec."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Introduces a periodic task to remove node history entries which exceed"},{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_f10f0c2b","line":46,"updated":"2020-08-07 17:34:09.000000000","message":"I recall discussing whether we should store state transitions separately from error events, but I can\u0027t remember whether there was any good reason for it.\n\nnone I can think of now.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f800fbeedf214d436c45b97e2bf7f2d8222f11c9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  change."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"The range could be extended according to requirements in the future, but not"},{"line_number":46,"context_line":"included in this spec."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Introduces a periodic task to remove node history entries which exceed"},{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_bf7bf289","line":46,"in_reply_to":"9f560f44_18ddf813","updated":"2020-08-20 20:05:49.000000000","message":"The encountered state would be good to record.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  change."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"The range could be extended according to requirements in the future, but not"},{"line_number":46,"context_line":"included in this spec."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Introduces a periodic task to remove node history entries which exceed"},{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_18ddf813","line":46,"in_reply_to":"9f560f44_f10f0c2b","updated":"2020-08-19 12:30:15.000000000","message":"The reason of saving state transition is an operator may want to know how the node is operated previously, for example a clean failed state could be the result of a failed provisioning gone through automated clean, without the operation history it may not be obvious to operators. By saving last error as rows it may not be required, but seems helpful if having it.\n\nIt makes me thinking if we want to have a finer control on what kinds of events should be logged? Like:\n\n  [conductor]\n  enabled_events \u003d errors,states\n\nOpinions welcome :)","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":46,"context_line":"included in this spec."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Introduces a periodic task to remove node history entries which exceed"},{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Adds a ``history`` module to provide history interface abstraction and provides"},{"line_number":52,"context_line":"two implementation with ``noop`` and ``database``."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_cbf17903","line":49,"updated":"2020-08-07 16:12:43.000000000","message":"awesome!","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2465d92a467a386784497e9f031ea1a4a7c223d5","unresolved":false,"context_lines":[{"line_number":46,"context_line":"included in this spec."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Introduces a periodic task to remove node history entries which exceed"},{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Adds a ``history`` module to provide history interface abstraction and provides"},{"line_number":52,"context_line":"two implementation with ``noop`` and ``database``."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_91017008","line":49,"in_reply_to":"9f560f44_cbf17903","updated":"2020-08-07 17:34:09.000000000","message":"perfect, glad to see this is included","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Adds a ``history`` module to provide history interface abstraction and provides"},{"line_number":52,"context_line":"two implementation with ``noop`` and ``database``."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_eb3b9d34","line":52,"updated":"2020-08-07 16:12:43.000000000","message":"I really like this idea. I\u0027m not sure about the name database because if I were to implement a mongodb driver to leverage the capped collection capability, and just had ironic never try to delete anything, then technically that is still a database, just a different style of database. Regardless, this is only a nit.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f800fbeedf214d436c45b97e2bf7f2d8222f11c9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Adds a ``history`` module to provide history interface abstraction and provides"},{"line_number":52,"context_line":"two implementation with ``noop`` and ``database``."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_7f5dda13","line":52,"in_reply_to":"9f560f44_d8e420af","updated":"2020-08-20 20:05:49.000000000","message":"Yeah, it is sort of to each their own. I do really like the idea and leaving the cleanup to the database kind of makes it agnostic if we\u0027re talking entirely through the plugin and not directly to the object model.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Adds a ``history`` module to provide history interface abstraction and provides"},{"line_number":52,"context_line":"two implementation with ``noop`` and ``database``."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_d8e420af","line":52,"in_reply_to":"9f560f44_eb3b9d34","updated":"2020-08-19 12:30:15.000000000","message":"For database with capped storage, maybe we just turn the periodic task off, or define an interface from the base \"history\" module like this:\n\ndef clean_up(self)\n    LOG.debug(\u0027do nothing\u0027)\n    pass\n\nDmitry mentioned he used to use redis, I feel it\u0027s hard to define a proper name, sometimes these services are versatile and used in different ways.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":73,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_6bd78d4c","line":70,"updated":"2020-08-07 16:12:43.000000000","message":"should be fine as long as we don\u0027t try and index the event field.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":73,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":74,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_ebc8bd55","line":71,"updated":"2020-08-07 16:12:43.000000000","message":"Because of the data structures, we\u0027ll need to make sure mysql/postgres database users have the node_id column indexed so the database doesn\u0027t have to scan the table looking for matching node_id values, it just finds them and returns them from the index. Largely because the DB is going to need to hunt down the event column data for every query. It will be fully populated in every object.\n\nIf we can\u0027t work this out so it is automatically done for users, then we need to likely put it in docs and stress that the column needs to be indexed.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":73,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":74,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_f33947a3","line":71,"in_reply_to":"9f560f44_ebc8bd55","updated":"2020-08-19 12:30:15.000000000","message":"I wonder how sqlalchemy behaves if a backend doesn\u0027t support indexing?\nAlso added a ``conductor`` column to record who reported this error.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f800fbeedf214d436c45b97e2bf7f2d8222f11c9","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":73,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":74,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_7fb2fa4a","line":71,"in_reply_to":"9f560f44_f33947a3","updated":"2020-08-20 20:05:49.000000000","message":"Good idea on the extra column. So that is a really good question on the index. :\\","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                    mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"``event`` is the string conveys what happened to the node, the content will"},{"line_number":79,"context_line":"be truncated to 1024 characters."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_4bf2899b","line":79,"updated":"2020-08-07 16:12:43.000000000","message":"From a database interaction/design standpoint, I\u0027d might consider truncating at 1000 chars so there is padding to keep things from actually being over 1k window.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                    mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"``event`` is the string conveys what happened to the node, the content will"},{"line_number":79,"context_line":"be truncated to 1024 characters."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_d36d2399","line":79,"in_reply_to":"9f560f44_4bf2899b","updated":"2020-08-19 12:30:15.000000000","message":"As a db newbie, I can trust you :)","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a29584d8b439d34a66e0cfa7030ae11f3197ca56","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                    mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"``event`` is the string conveys what happened to the node, the content will"},{"line_number":79,"context_line":"be truncated to 1024 characters."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_6b7e6de4","line":79,"in_reply_to":"9f560f44_4bf2899b","updated":"2020-08-07 16:13:58.000000000","message":"Totally a nit though, and I\u0027m likely mentally trying to over-optimize, but I know some telecoms are going to want to turn this on and roll with it once it is available.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":96,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":97,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":98,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":99,"context_line":"  * For a normal request, 200 is returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_4b4729bd","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":70},"updated":"2020-08-07 16:12:43.000000000","message":"I\u0027m not sure truncating for the API user really helps.\n\nIt means a user is going to have to query twice","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":96,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":97,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":98,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":99,"context_line":"  * For a normal request, 200 is returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_33e0dffa","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":70},"in_reply_to":"9f560f44_4b4729bd","updated":"2020-08-19 12:30:15.000000000","message":"I don\u0027t like truncation tbh, but we need to consider the data amount, withoug truncation we probably need a summary field to provide brief information, maybe that looks better, hmm .. Any ideas?","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2465d92a467a386784497e9f031ea1a4a7c223d5","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":96,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":97,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":98,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":99,"context_line":"  * For a normal request, 200 is returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_91869065","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":70},"in_reply_to":"9f560f44_4b4729bd","updated":"2020-08-07 17:34:09.000000000","message":"it\u0027s important to have two APIs here, but I think this misses the mark slightly:\n1. list of all events in the history, likely paginated because the event log could be very long\n2. full details for a single event\n\nMy general preference in designing APIs is for a \"?detail\" parameter to be optional on the \"list\" call, which causes the API to include full details of the events rather than either mere IDs or ID+summary, for the events within the pagination range being returned, and for this not to be the default.\n\nin this way, the default client experience avoids being overwhelmed when there is a lot more data than expected.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"335bff36dfc7bded652f536f2569b4cf7dfd006f","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":96,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":97,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":98,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":99,"context_line":"  * For a normal request, 200 is returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_c251aadb","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":70},"in_reply_to":"9f560f44_7f8b1a67","updated":"2020-08-21 05:30:55.000000000","message":"I feel like we would still have a summary field that provides short info on the error and return by default, if the consumer needs details, it can do a full query with fields or with detail\u003dtrue.\nThe fact is not all events are important, experienced operator may only need to check a few related events.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":96,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":97,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":98,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":99,"context_line":"  * For a normal request, 200 is returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_93cf2b7e","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":70},"in_reply_to":"9f560f44_91869065","updated":"2020-08-19 12:30:15.000000000","message":"I agree, pagination and details querying are also adopted in other api resources, we can just follow existing pattern.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f800fbeedf214d436c45b97e2bf7f2d8222f11c9","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":96,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":97,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":98,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":99,"context_line":"  * For a normal request, 200 is returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_7f8b1a67","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":70},"in_reply_to":"9f560f44_93cf2b7e","updated":"2020-08-20 20:05:49.000000000","message":"What if we simply don\u0027t truncate?\n\nIs the full packet payload per line more or less costly than generating new/additional api queries?","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"445c1be8e8408c3a2b275746dae0a9df8c962712","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":96,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":97,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":98,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":99,"context_line":"  * For a normal request, 200 is returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_26c34cef","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":70},"in_reply_to":"9f560f44_c251aadb","updated":"2020-08-21 20:21:04.000000000","message":"Yeah, some way to classify them...","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2465d92a467a386784497e9f031ea1a4a7c223d5","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"OSC will be enhanced to support following operations:"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* ``openstack baremetal node history list``: list all events kept for this node"},{"line_number":115,"context_line":"* ``openstack baremetal node history show \u003cuuid\u003e``: show a specific node event"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"RPC API impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_318b4468","line":114,"updated":"2020-08-07 17:34:09.000000000","message":"\"history list\" should include options for pagination, e.g. to handle very large clusters where the total number of events within \"node_history_ttl\" is overwhelmingly large.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"OSC will be enhanced to support following operations:"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* ``openstack baremetal node history list``: list all events kept for this node"},{"line_number":115,"context_line":"* ``openstack baremetal node history show \u003cuuid\u003e``: show a specific node event"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"RPC API impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_93944b46","line":114,"in_reply_to":"9f560f44_318b4468","updated":"2020-08-19 12:30:15.000000000","message":"Indeed, we have --limit and --marker available for nodes, that pattern will be applied to history I think.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2465d92a467a386784497e9f031ea1a4a7c223d5","unresolved":false,"context_lines":[{"line_number":147,"context_line":"Scalability impact"},{"line_number":148,"context_line":"------------------"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"Should be no obvious scalability impact."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Performance Impact"},{"line_number":153,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_31e06426","line":150,"updated":"2020-08-07 17:34:09.000000000","message":"on very large or busy clusters, this could have a measurable impact on database size.\n\nI recommend mentioning it here and in documentation when this feature is released; operators will want to evaluate the default \"node_history_ttl\" for their environment.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":147,"context_line":"Scalability impact"},{"line_number":148,"context_line":"------------------"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"Should be no obvious scalability impact."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Performance Impact"},{"line_number":153,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_93556b53","line":150,"in_reply_to":"9f560f44_31e06426","updated":"2020-08-19 12:30:15.000000000","message":"Updated, btw the default backend should be noop, it seems I forgot to write it down :(","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"794dd740947e0295a5247858cfff54df6cb5b170","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Add following configuration options to change the behavior of this feature:"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``. ``noop``"},{"line_number":164,"context_line":"  backend does nothing and effectively disable this feature."},{"line_number":165,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":166,"context_line":"  records. Events with create time exceeding specified ttl will be removed."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_6bccad34","line":163,"updated":"2020-08-07 16:16:14.000000000","message":"This line needs to be wrapped, it is why the linter is failing it.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Add following configuration options to change the behavior of this feature:"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``. ``noop``"},{"line_number":164,"context_line":"  backend does nothing and effectively disable this feature."},{"line_number":165,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":166,"context_line":"  records. Events with create time exceeding specified ttl will be removed."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_d377e339","line":163,"in_reply_to":"9f560f44_6bccad34","updated":"2020-08-19 12:30:15.000000000","message":"Done","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":164,"context_line":"  backend does nothing and effectively disable this feature."},{"line_number":165,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":166,"context_line":"  records. Events with create time exceeding specified ttl will be removed."},{"line_number":167,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":168,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":169,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":170,"context_line":"  will disable clean up."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_eb70bd74","line":167,"updated":"2020-08-07 16:12:43.000000000","message":"Awesome, We\u0027ll likely need a giant warning in the release note or documentation for this.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cb353231e77f67ad1d426c6965f8c30d195bd137","unresolved":false,"context_lines":[{"line_number":189,"context_line":"Work Items"},{"line_number":190,"context_line":"----------"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"Implements proposed work."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Dependencies"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_6b330dac","line":192,"range":{"start_line":192,"start_character":0,"end_line":192,"end_character":25},"updated":"2020-08-07 16:12:43.000000000","message":"So I would put the items in at a high level.\n- Implement DB layer\n- Implement util helper to facilitate creation of entries\n- Implement API interface\n- Add documentation.","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"62d21fa1c927c6e57404293a15d5e9a2356c8252","unresolved":false,"context_lines":[{"line_number":189,"context_line":"Work Items"},{"line_number":190,"context_line":"----------"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"Implements proposed work."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Dependencies"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_93da8be6","line":192,"range":{"start_line":192,"start_character":0,"end_line":192,"end_character":25},"in_reply_to":"9f560f44_6b330dac","updated":"2020-08-19 12:30:15.000000000","message":":)","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f800fbeedf214d436c45b97e2bf7f2d8222f11c9","unresolved":false,"context_lines":[{"line_number":189,"context_line":"Work Items"},{"line_number":190,"context_line":"----------"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"Implements proposed work."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Dependencies"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_7fe03a27","line":192,"range":{"start_line":192,"start_character":0,"end_line":192,"end_character":25},"in_reply_to":"9f560f44_93da8be6","updated":"2020-08-20 20:05:49.000000000","message":"Oh, don\u0027t forget \"Make magic happen!\"","commit_id":"b58dd2e8571b3abc91117ca412e219747b008091"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e4c0acabf5e6faba83044de4e07b8868b32ab4d2","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* state transition"},{"line_number":42,"context_line":"* everything goes to last_error, this also covers node maintenance state"},{"line_number":43,"context_line":"  change."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"The range could be extended according to requirements in the future, but not"},{"line_number":46,"context_line":"included in this spec."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f65232a_5cecb528","line":43,"updated":"2020-10-26 14:55:29.000000000","message":"i\u0027d also like to know who requested the change and date/time of the change.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"9ff6f93086c9a24f5e8a907ed73fb40891cbc8ed","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* state transition"},{"line_number":42,"context_line":"* everything goes to last_error, this also covers node maintenance state"},{"line_number":43,"context_line":"  change."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"The range could be extended according to requirements in the future, but not"},{"line_number":46,"context_line":"included in this spec."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1f621f24_640f0637","line":43,"in_reply_to":"3f65232a_5cecb528","updated":"2020-11-09 15:54:02.000000000","message":"I am not sure context is available in all cases, but we may have a field for it.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"07822893a98d2a32e53ea86da3c75c233db52dfd","unresolved":false,"context_lines":[{"line_number":46,"context_line":"included in this spec."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Introduces a periodic task to remove node history entries which exceed"},{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Adds a ``history`` module to provide history interface abstraction and provides"},{"line_number":52,"context_line":"two implementation with ``noop`` and ``database``."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f65232a_bc41890e","line":49,"updated":"2020-10-26 14:58:11.000000000","message":"please describe the configuration options (name, value, etc) so we can bikeshed now instead of later :)","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"65a3910d93c1f1f1c56c862ab75ad1bb696e15ae","unresolved":false,"context_lines":[{"line_number":46,"context_line":"included in this spec."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Introduces a periodic task to remove node history entries which exceed"},{"line_number":49,"context_line":"specified life time, the time will be configurable by configuration options."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Adds a ``history`` module to provide history interface abstraction and provides"},{"line_number":52,"context_line":"two implementation with ``noop`` and ``database``."}],"source_content_type":"text/x-rst","patch_set":3,"id":"d7944434_d34bef25","line":49,"in_reply_to":"3f65232a_bc41890e","updated":"2020-11-24 11:17:25.000000000","message":"The configuration options are listed under other deploy impact below.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b98bb4dc046b59e95a7410b99f7585307b9ebaa5","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A new database table will be added with following schema::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    op.create_table(\u0027node_history\u0027,"},{"line_number":66,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_679da756","line":65,"updated":"2020-09-01 14:26:41.000000000","message":"A further thought: provide a failure code for each ironic exception and store it here?","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"005df308b7ae5a729363998c57878493d5f22e06","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A new database table will be added with following schema::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    op.create_table(\u0027node_history\u0027,"},{"line_number":66,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_c7759334","line":65,"updated":"2020-09-01 14:25:40.000000000","message":"Do we need a boolean failed/succeeded?","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"91c3bf74f3dde51eac37bc46d791aef2db377b02","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A new database table will be added with following schema::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    op.create_table(\u0027node_history\u0027,"},{"line_number":66,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_8e0a741d","line":65,"in_reply_to":"9f560f44_679da756","updated":"2020-09-03 06:17:57.000000000","message":"current exception code are api oriented, it\u0027s observable for those raised to the requester, but other exceptions are thrown in the background, I am not sure this information is helpful.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0f177be0f6e435d1f3d49333650cb648f659774e","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A new database table will be added with following schema::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    op.create_table(\u0027node_history\u0027,"},{"line_number":66,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_43a249af","line":65,"in_reply_to":"9f560f44_8e0a741d","updated":"2020-09-14 13:49:52.000000000","message":"The basic failure code path is kind of a PITA and if we do that then we loose context and someone troubleshooting still needs to be an expert in the code and have context about the nodes to be able to investigate the issue when it could have been just bad data was put in to begin with.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"19fa02adf08f71a1e76d5f1b67030be3c9cddde8","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_911f5908","line":70,"updated":"2020-09-01 12:51:48.000000000","message":"Conductors have integer IDs, let\u0027s use them instead","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"b086bcfa07718b885244c940e0745f764402a58f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_6f248cb3","line":70,"in_reply_to":"9f560f44_63b82de8","updated":"2020-09-14 15:39:57.000000000","message":"I believe Julia\u0027s correct. \n\nThere are two failure modes in the current proposal\n- what if a conductor name is changed? this table\u0027s references would be broken\n- what if a conductor migration happens and a name is reused later? this table\u0027s references would be unable to represent that information\n\na JOIN from a large table (this one) to a relatively small table (`conductors`) is not costly in a relational database because the JOIN KEY is the PRIMARY KEY of the small table.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"65a3910d93c1f1f1c56c862ab75ad1bb696e15ae","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"6ff6eea2_5d220251","line":70,"in_reply_to":"9f560f44_6d26cf18","updated":"2020-11-24 11:17:25.000000000","message":"Another reason I want to avoid conductor.id is performance consideration, we already hit this for ports.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"91c247d098a46368a8476aca93b6fffd0b7e5620","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_6d26cf18","line":70,"in_reply_to":"9f560f44_6f248cb3","updated":"2020-09-22 11:45:03.000000000","message":"conductor name is unique just like the conductor.id, I think they are actually interchangeable in some way.\nI don\u0027t quite get the examples above, as I understand it, changing hostname will definitely break the relationship.\nOne consideration to avoid a foreignkey is that we probably will have use case that running conductors in containers, we probably want to clear inactive conductor records but we don\u0027t want to remove logs associated.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"91c3bf74f3dde51eac37bc46d791aef2db377b02","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_ce346ce2","line":70,"in_reply_to":"9f560f44_911f5908","updated":"2020-09-03 06:17:57.000000000","message":"then we need to join tables to get conductor names, it would be a performance loss, opinions?","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0f177be0f6e435d1f3d49333650cb648f659774e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_63b82de8","line":70,"in_reply_to":"9f560f44_ce346ce2","updated":"2020-09-14 13:49:52.000000000","message":"A join for small table isn\u0027t a big deal as long as the column matching the tables together is indexed in both tables.... At least that is what my memory serves.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"19fa02adf08f71a1e76d5f1b67030be3c9cddde8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_711c4513","line":71,"updated":"2020-09-01 12:51:48.000000000","message":"I wonder if we could formalize events, so that we could minimize the size of information we keep here. Actually, I think event_type (integer) would be very useful for automatically processing events. And then maybe make the text very minimum, like instead of \"Power state was changed to \u0027power on\u0027\" do event_type\u003d42 (power change), event\u003d\"power on\".\n\nWe can then generate a human-readable description for the API but not store it.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"824a4cd8547551bca2310ee27ea2449281a3de11","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_8453996c","line":71,"in_reply_to":"9f560f44_648f652e","updated":"2020-09-01 13:50:00.000000000","message":"a second thought, this change will form a contract between integers with events, how would we support those events not coming from the upstream, e.g. out of tree drivers?","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"d36ece2efaec47781d4a3aec31bde71545bd259f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_a4eb3dda","line":71,"in_reply_to":"9f560f44_711c4513","updated":"2020-09-01 13:36:05.000000000","message":"I think this is a great idea, maybe not really to be an integer type, we just need a code page instead of all the logs. I wonder if we can centralize all the logs separated in the code.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"91bca7eea8bca49af049e1746b36e934bed590d3","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_84d8b9f0","line":71,"in_reply_to":"9f560f44_8453996c","updated":"2020-09-01 13:51:43.000000000","message":"For example, we can declare that all numbers \u003c1000 are reserved for ironic, everything else can be used by out of tree drivers.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"badd35f7320c3353adf6966c9176149562129d53","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":69,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_648f652e","line":71,"in_reply_to":"9f560f44_a4eb3dda","updated":"2020-09-01 13:38:34.000000000","message":"I\u0027d prefer an integer because it\u0027s small, and size will matter a lot for such an often changing table.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"40b2de65f69ce33686850e4c90f8ce450c5b0190","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":71,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":75,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":76,"context_line":"                                            mysql_ENGINE\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f65232a_3cc0d97b","line":73,"updated":"2020-10-26 14:57:26.000000000","message":"Consensus from the PTG, We feel that we need a \"who did it\" and \"what was the request id\"","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"72f802591671c687cbc4c218bc8323a1972768c9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":75,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":76,"context_line":"                                            mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":77,"context_line":"                                            mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":78,"context_line":"                    sa.Index(\u0027node_id\u0027, \u0027node_id\u0027)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"``event`` is the string conveys what happened to the node, the content will"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_866978f9","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":73},"updated":"2020-08-21 20:38:32.000000000","message":"We\u0027ll likey want to make sure that deleting a ndoe purges the history for the node.... if we keep the constraint. We could just decouple it thought. Just a thought.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"19fa02adf08f71a1e76d5f1b67030be3c9cddde8","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":75,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":76,"context_line":"                                            mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":77,"context_line":"                                            mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":78,"context_line":"                    sa.Index(\u0027node_id\u0027, \u0027node_id\u0027)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"``event`` is the string conveys what happened to the node, the content will"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_d119d122","line":77,"updated":"2020-09-01 12:51:48.000000000","message":"Yeah, it\u0027s an issue. Maybe we decouple these and create a periodic task to purge this table in small batches?\n\nI still wonder if RDBMS is a good storage for such kind of data..","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3a54c6c1b6b082ba5fee525be755cd04c000fd3","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":73,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":75,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":76,"context_line":"                                            mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":77,"context_line":"                                            mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":78,"context_line":"                    sa.Index(\u0027node_id\u0027, \u0027node_id\u0027)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"``event`` is the string conveys what happened to the node, the content will"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_e473fae5","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":73},"in_reply_to":"9f560f44_866978f9","updated":"2020-08-24 11:01:26.000000000","message":"Due to the comments below, I am curious how interesting if a node with a bunch of history will be removed :/","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"d36ece2efaec47781d4a3aec31bde71545bd259f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                    sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_history0uuid\u0027),"},{"line_number":75,"context_line":"                    sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":76,"context_line":"                                            mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":77,"context_line":"                                            mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027)"},{"line_number":78,"context_line":"                    sa.Index(\u0027node_id\u0027, \u0027node_id\u0027)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"``event`` is the string conveys what happened to the node, the content will"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_64f3e5e8","line":77,"in_reply_to":"9f560f44_d119d122","updated":"2020-09-01 13:36:05.000000000","message":"I understand, it may not be the best choice, but introducing other component needs integration, not all use case want to maintain addition services, and in some minimumized scenarios even some basic openstack services could be dropped. RMDBS is still an offering fit in most cases.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"19fa02adf08f71a1e76d5f1b67030be3c9cddde8","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* GET /v1/{node_ident}/history"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":98,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":99,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":100,"context_line":"    will be returned if ``detail`` is set to True in the query string."}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_b116ddf0","line":97,"updated":"2020-09-01 12:51:48.000000000","message":"We need a default limit probably.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"91c3bf74f3dde51eac37bc46d791aef2db377b02","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* GET /v1/{node_ident}/history"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":98,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":99,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":100,"context_line":"    will be returned if ``detail`` is set to True in the query string."}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_ce390cd0","line":97,"in_reply_to":"9f560f44_b116ddf0","updated":"2020-09-03 06:17:57.000000000","message":"we have a guard at [api]max_limit","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"19fa02adf08f71a1e76d5f1b67030be3c9cddde8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"  * Retrieve the list of events logged for this node. By default ``uuid``,"},{"line_number":98,"context_line":"    ``event`` and ``created_at`` are returned. The ``event`` will be"},{"line_number":99,"context_line":"    truncated to 255 to give a brief information. Detailed history entry"},{"line_number":100,"context_line":"    will be returned if ``detail`` is set to True in the query string."},{"line_number":101,"context_line":"  * For a normal request, 200 is returned."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"* GET /v1/{node_ident}/history/{history_uuid}"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_11d18930","line":100,"updated":"2020-09-01 12:51:48.000000000","message":"See above my opinion on event.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e4c0acabf5e6faba83044de4e07b8868b32ab4d2","unresolved":false,"context_lines":[{"line_number":149,"context_line":"Scalability impact"},{"line_number":150,"context_line":"------------------"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Node events could occupy considerable amount of data in the database"},{"line_number":153,"context_line":"when this feature is enabled, depending on the scale of bare metals and"},{"line_number":154,"context_line":"activities. In such case the configuration options of this feature should be"},{"line_number":155,"context_line":"evaluated."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f65232a_5c879562","line":152,"updated":"2020-10-26 14:55:29.000000000","message":"This is great, I\u0027d like something like this. nova has a similar thing -- my suggestion would be to document here how nova does it (from user point of view and implementation). and we should try to do a similar thing in ironic. where it diverges from nova, we ought to note this. I think having some sort of consistent \u0027interface\u0027 across openstack services, for accessing \u0027history\u0027 would be useful.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"9ff6f93086c9a24f5e8a907ed73fb40891cbc8ed","unresolved":false,"context_lines":[{"line_number":149,"context_line":"Scalability impact"},{"line_number":150,"context_line":"------------------"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Node events could occupy considerable amount of data in the database"},{"line_number":153,"context_line":"when this feature is enabled, depending on the scale of bare metals and"},{"line_number":154,"context_line":"activities. In such case the configuration options of this feature should be"},{"line_number":155,"context_line":"evaluated."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1f621f24_8f5ebb0f","line":152,"in_reply_to":"3f65232a_5c879562","updated":"2020-11-09 15:54:02.000000000","message":"I didn\u0027t dive into how nova is doing this, but from the viewpoint of an operator, nova has a concept of tasks, they provide a history of instance actions, but apparently we still can\u0027t figure out the cause when something goes wrong.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"72f802591671c687cbc4c218bc8323a1972768c9","unresolved":false,"context_lines":[{"line_number":158,"context_line":"------------------"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"The new periodic task and database access will use some resource, but should"},{"line_number":161,"context_line":"be trivial."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Other deployer impact"},{"line_number":164,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_e652f434","line":161,"updated":"2020-08-21 20:38:32.000000000","message":"One thing we may want to do is enable an operator to set a limit on the number of rows purged by the periodic task at a time. Specifically because Deleting a thousand or ten thousand rows on a table can lock the table for a while.\n\nIt may not be something easily supported by sqlalchemy, but something to consider because bulk cleanups can be very impacting. I once had 13 million events and only needed about 500,000 of them. Batch update wise I could get like 130,000 an hour and block the entire monitoring system, or I could get like a hundred every five minutes. It took a while, but the DB was eventually back to a sane size.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"19fa02adf08f71a1e76d5f1b67030be3c9cddde8","unresolved":false,"context_lines":[{"line_number":158,"context_line":"------------------"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"The new periodic task and database access will use some resource, but should"},{"line_number":161,"context_line":"be trivial."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Other deployer impact"},{"line_number":164,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_f1d5f51c","line":161,"updated":"2020-09-01 12:51:48.000000000","message":"We absolutely need to remove information in batches, even for 7 days we can generate quite a lot if we have thousands of nodes.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3a54c6c1b6b082ba5fee525be755cd04c000fd3","unresolved":false,"context_lines":[{"line_number":158,"context_line":"------------------"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"The new periodic task and database access will use some resource, but should"},{"line_number":161,"context_line":"be trivial."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Other deployer impact"},{"line_number":164,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_e45c9a4c","line":161,"in_reply_to":"9f560f44_e652f434","updated":"2020-08-24 11:01:26.000000000","message":"It\u0027s out of my expectation for this amount of events, but *shrugs* because by default we keep records for 7 days.\nMaybe we could reduce the default ttl, but we don\u0027t know what value users perfer in reality :(","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"1fd2c3db3430b47ce62858827299fbbfa4eb818c","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"Add following configuration options to change the behavior of this feature:"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``."},{"line_number":169,"context_line":"  ``noop`` backend does nothing and effectively disable this feature. This"},{"line_number":170,"context_line":"  option will default to ``noop``."},{"line_number":171,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":172,"context_line":"  records. Events with create time exceeding specified ttl will be removed."},{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_ef3c1cc2","line":170,"range":{"start_line":168,"start_character":39,"end_line":170,"end_character":34},"updated":"2020-09-14 15:52:06.000000000","message":"How about calling this \"none\", rather than \"noop\"?","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"65a3910d93c1f1f1c56c862ab75ad1bb696e15ae","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"Add following configuration options to change the behavior of this feature:"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``."},{"line_number":169,"context_line":"  ``noop`` backend does nothing and effectively disable this feature. This"},{"line_number":170,"context_line":"  option will default to ``noop``."},{"line_number":171,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":172,"context_line":"  records. Events with create time exceeding specified ttl will be removed."},{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."}],"source_content_type":"text/x-rst","patch_set":3,"id":"e3d3fc0f_7fa49a80","line":170,"range":{"start_line":168,"start_character":39,"end_line":170,"end_character":34},"in_reply_to":"1f621f24_0fa8ebd8","updated":"2020-11-24 11:17:25.000000000","message":"Changed to none","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"9ff6f93086c9a24f5e8a907ed73fb40891cbc8ed","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"Add following configuration options to change the behavior of this feature:"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``."},{"line_number":169,"context_line":"  ``noop`` backend does nothing and effectively disable this feature. This"},{"line_number":170,"context_line":"  option will default to ``noop``."},{"line_number":171,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":172,"context_line":"  records. Events with create time exceeding specified ttl will be removed."},{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1f621f24_0fa8ebd8","line":170,"range":{"start_line":168,"start_character":39,"end_line":170,"end_character":34},"in_reply_to":"9f560f44_ef3c1cc2","updated":"2020-11-09 15:54:02.000000000","message":"sounds good","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"1fd2c3db3430b47ce62858827299fbbfa4eb818c","unresolved":false,"context_lines":[{"line_number":168,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``."},{"line_number":169,"context_line":"  ``noop`` backend does nothing and effectively disable this feature. This"},{"line_number":170,"context_line":"  option will default to ``noop``."},{"line_number":171,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":172,"context_line":"  records. Events with create time exceeding specified ttl will be removed."},{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":174,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":175,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":176,"context_line":"  will disable clean up."}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_efaa5cd1","line":173,"range":{"start_line":171,"start_character":2,"end_line":173,"end_character":78},"updated":"2020-09-14 15:52:06.000000000","message":"Here, I would advocate for node_history_max_entrie (or similar) and base things on number of entries rather than time: a time limit does not limit how much data is stored, while a limit on the entries does.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"9ff6f93086c9a24f5e8a907ed73fb40891cbc8ed","unresolved":false,"context_lines":[{"line_number":168,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``."},{"line_number":169,"context_line":"  ``noop`` backend does nothing and effectively disable this feature. This"},{"line_number":170,"context_line":"  option will default to ``noop``."},{"line_number":171,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":172,"context_line":"  records. Events with create time exceeding specified ttl will be removed."},{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":174,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":175,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":176,"context_line":"  will disable clean up."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1f621f24_afbd7703","line":173,"range":{"start_line":171,"start_character":2,"end_line":173,"end_character":78},"in_reply_to":"1f621f24_d91db3be","updated":"2020-11-09 15:54:02.000000000","message":"Put a limit based on records instead of time will effectively make the history under control, I think it\u0027s a good way to go.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"d4e465d3fb915d1270f1b1bb506f19ff57a1200e","unresolved":false,"context_lines":[{"line_number":168,"context_line":"* ``[conductor]node_history_backend``: can be ``noop`` and ``database``."},{"line_number":169,"context_line":"  ``noop`` backend does nothing and effectively disable this feature. This"},{"line_number":170,"context_line":"  option will default to ``noop``."},{"line_number":171,"context_line":"* ``[conductor]node_history_ttl``: how long in days, ironic should keep history"},{"line_number":172,"context_line":"  records. Events with create time exceeding specified ttl will be removed."},{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":174,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":175,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":176,"context_line":"  will disable clean up."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1f621f24_d91db3be","line":173,"range":{"start_line":171,"start_character":2,"end_line":173,"end_character":78},"in_reply_to":"9f560f44_efaa5cd1","updated":"2020-10-28 09:39:57.000000000","message":"I agree with Arne about this.\nAlso, are we talking about entries per node or in total ?\nIt could be interesting to set both actually, a total amount of entries, but also per node.\nThis would be helpful in case a node is logging much more than others as pointer of issues, while having just a generic total may not highlight that.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"72f802591671c687cbc4c218bc8323a1972768c9","unresolved":false,"context_lines":[{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":174,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":175,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":176,"context_line":"  will disable clean up."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Developer impact"},{"line_number":179,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_49281185","line":176,"updated":"2020-08-21 20:38:32.000000000","message":"I\u0027d recommend a max number of rows to delete at a time item.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"65a3910d93c1f1f1c56c862ab75ad1bb696e15ae","unresolved":false,"context_lines":[{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":174,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":175,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":176,"context_line":"  will disable clean up."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Developer impact"},{"line_number":179,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"83d59b9a_be075456","line":176,"in_reply_to":"9f560f44_41e3b334","updated":"2020-11-24 11:17:25.000000000","message":"By putting a limit to the max entries, I feel the periodic task is made less useful.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3a54c6c1b6b082ba5fee525be755cd04c000fd3","unresolved":false,"context_lines":[{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":174,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":175,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":176,"context_line":"  will disable clean up."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Developer impact"},{"line_number":179,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_841afe79","line":176,"in_reply_to":"9f560f44_49281185","updated":"2020-08-24 11:01:26.000000000","message":"It\u0027s consecutive batch removes in one periodic task right?\nThen we probably don\u0027t need another option, just use a fixed value.","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"32f25515573e4ba1a5729edbc76527772dd394e2","unresolved":false,"context_lines":[{"line_number":173,"context_line":"  The default value is 7 days. Set to 0 will permanantly keep history records."},{"line_number":174,"context_line":"* ``[conductor]node_history_cleanup_interval``: the interval in seconds, the"},{"line_number":175,"context_line":"  clean up periodic task should be scheduled. One day by default. Set to 0"},{"line_number":176,"context_line":"  will disable clean up."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Developer impact"},{"line_number":179,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_41e3b334","line":176,"in_reply_to":"9f560f44_841afe79","updated":"2020-08-24 13:57:36.000000000","message":"Yeah, if we set it at 100, I can\u0027t imagine it being too much of an issue...","commit_id":"03b7f81e0af23db4952beb4b6c28dcd5007f5423"}]}
