)]}'
{"ironic/common/exception.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c174879689822dbe7a05f4f9569999387e5bb220","unresolved":true,"context_lines":[{"line_number":810,"context_line":"                 \u0027presently executing a command. Error %(error)s\u0027)"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"class NodeHistoryNotFound(NotFound):"},{"line_number":814,"context_line":"    _msg_fmt \u003d _(\"NodeHistory %(history)s could not be found.\")"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"class NodeHistoryAlreadyExists(Conflict):"}],"source_content_type":"text/x-python","patch_set":7,"id":"18355c73_3b723ea0","line":814,"range":{"start_line":813,"start_character":0,"end_line":814,"end_character":63},"updated":"2021-01-19 01:34:02.000000000","message":"In the context of other comments, this exception won\u0027t be needed if history is only ever fetched by node id. No history will return an empty list.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af2d58d12ccd7dfe59c102f965e409147fa5c18d","unresolved":false,"context_lines":[{"line_number":811,"context_line":""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"class NodeHistoryNotFound(NotFound):"},{"line_number":814,"context_line":"    _msg_fmt \u003d _(\"NodeHistory %(history)s could not be found.\")"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"class NodeHistoryAlreadyExists(Conflict):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a3f9744_32ad2d62","line":814,"updated":"2021-02-03 13:13:47.000000000","message":"nit: \"Node history record ...\"","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"a9afbedcae2f33e3eeacf840b31f6ffdcc4a6f0b","unresolved":false,"context_lines":[{"line_number":810,"context_line":"                 \u0027presently executing a command. Error %(error)s\u0027)"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"class NodeHistoryNotFound(NotFound):"},{"line_number":814,"context_line":"    _msg_fmt \u003d _(\"NodeHistory %(history)s could not be found.\")"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"class NodeHistoryAlreadyExists(Conflict):"}],"source_content_type":"text/x-python","patch_set":7,"id":"c24ea3a7_38c7c2e3","line":814,"range":{"start_line":813,"start_character":0,"end_line":814,"end_character":63},"in_reply_to":"0602cf0f_b359a750","updated":"2021-01-25 20:15:50.000000000","message":"ack","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6044e2dac2b1e464983dfe6bac0280ea3b27f125","unresolved":true,"context_lines":[{"line_number":810,"context_line":"                 \u0027presently executing a command. Error %(error)s\u0027)"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"class NodeHistoryNotFound(NotFound):"},{"line_number":814,"context_line":"    _msg_fmt \u003d _(\"NodeHistory %(history)s could not be found.\")"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"class NodeHistoryAlreadyExists(Conflict):"}],"source_content_type":"text/x-python","patch_set":7,"id":"0602cf0f_b359a750","line":814,"range":{"start_line":813,"start_character":0,"end_line":814,"end_character":63},"in_reply_to":"18355c73_3b723ea0","updated":"2021-01-25 15:14:55.000000000","message":"This exception is used for retrieve a single node history entry","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af2d58d12ccd7dfe59c102f965e409147fa5c18d","unresolved":false,"context_lines":[{"line_number":815,"context_line":""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"class NodeHistoryAlreadyExists(Conflict):"},{"line_number":818,"context_line":"    _msg_fmt \u003d _(\"A history with UUID %(uuid)s already exists.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"974ab6f5_4a813dc6","line":818,"updated":"2021-02-03 13:13:47.000000000","message":"\"A history record\"\n\nActually, when can this happen? We don\u0027t allow a user to create a history record, do we?","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f66c275b46efabf82a41089e9b5b1c9fb4c42b9b","unresolved":false,"context_lines":[{"line_number":815,"context_line":""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"class NodeHistoryAlreadyExists(Conflict):"},{"line_number":818,"context_line":"    _msg_fmt \u003d _(\"A history with UUID %(uuid)s already exists.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"96c8d060_5daf7737","line":818,"in_reply_to":"974ab6f5_4a813dc6","updated":"2021-02-07 16:09:05.000000000","message":"yep we don\u0027t, this happens when there is a bug, since the create_node_history is changed to generate a uuid despite of arguments, it\u0027s safe to remove now.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"}],"ironic/common/release_mappings.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5df903589e59e4b5ff26e12995abf9992dc56d48","unresolved":true,"context_lines":[{"line_number":339,"context_line":"            \u0027Allocation\u0027: [\u00271.1\u0027],"},{"line_number":340,"context_line":"            \u0027BIOSSetting\u0027: [\u00271.1\u0027],"},{"line_number":341,"context_line":"            \u0027Node\u0027: [\u00271.35\u0027],"},{"line_number":342,"context_line":"            \u0027NodeHistory\u0027: [\u00271.0\u0027],"},{"line_number":343,"context_line":"            \u0027Conductor\u0027: [\u00271.3\u0027],"},{"line_number":344,"context_line":"            \u0027Chassis\u0027: [\u00271.3\u0027],"},{"line_number":345,"context_line":"            \u0027Deployment\u0027: [\u00271.0\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"d95ff556_ac7e5c63","line":342,"updated":"2021-08-05 00:53:07.000000000","message":"Should this line be deleted? Or moved to 18.1?","commit_id":"51a41e6d2cdd530445d376bbf4b517b785cbcb15"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"50c33055ecbcd680e0cb06c01efb2721a4a0f996","unresolved":true,"context_lines":[{"line_number":339,"context_line":"            \u0027Allocation\u0027: [\u00271.1\u0027],"},{"line_number":340,"context_line":"            \u0027BIOSSetting\u0027: [\u00271.1\u0027],"},{"line_number":341,"context_line":"            \u0027Node\u0027: [\u00271.35\u0027],"},{"line_number":342,"context_line":"            \u0027NodeHistory\u0027: [\u00271.0\u0027],"},{"line_number":343,"context_line":"            \u0027Conductor\u0027: [\u00271.3\u0027],"},{"line_number":344,"context_line":"            \u0027Chassis\u0027: [\u00271.3\u0027],"},{"line_number":345,"context_line":"            \u0027Deployment\u0027: [\u00271.0\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"40dbf6f2_e5666f53","line":342,"in_reply_to":"d95ff556_ac7e5c63","updated":"2021-08-06 15:40:09.000000000","message":"hmm wonder how that happened. It shoudl be master.","commit_id":"51a41e6d2cdd530445d376bbf4b517b785cbcb15"}],"ironic/db/api.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af2d58d12ccd7dfe59c102f965e409147fa5c18d","unresolved":false,"context_lines":[{"line_number":1314,"context_line":""},{"line_number":1315,"context_line":"    @abc.abstractmethod"},{"line_number":1316,"context_line":"    def create_node_history(self, values):"},{"line_number":1317,"context_line":"        \"\"\"Create a new history."},{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"        :param values: Dict of values."},{"line_number":1320,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"7fbc578a_884b482b","line":1317,"updated":"2021-02-03 13:13:47.000000000","message":"\"History\" sounds like the whole table, did you mean history_record?","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"2aa9a114d03238c80df45783057ab47778402fdb","unresolved":false,"context_lines":[{"line_number":1314,"context_line":""},{"line_number":1315,"context_line":"    @abc.abstractmethod"},{"line_number":1316,"context_line":"    def create_node_history(self, values):"},{"line_number":1317,"context_line":"        \"\"\"Create a new history."},{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"        :param values: Dict of values."},{"line_number":1320,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"7e8a5bc1_0a3de20f","line":1317,"in_reply_to":"7fbc578a_884b482b","updated":"2021-02-07 15:04:44.000000000","message":"yeah, I meant an event, kind of regret to name it node history, there would be no trouble if the whole feature is called Node Events ..","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c174879689822dbe7a05f4f9569999387e5bb220","unresolved":true,"context_lines":[{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"        :param values: Dict of values."},{"line_number":1320,"context_line":"        \"\"\""},{"line_number":1321,"context_line":""},{"line_number":1322,"context_line":"    @abc.abstractmethod"},{"line_number":1323,"context_line":"    def destroy_node_history_by_uuid(self, history_uuid):"},{"line_number":1324,"context_line":"        \"\"\"Destroy a history entry."}],"source_content_type":"text/x-python","patch_set":7,"id":"ef86ac45_8f6b51b9","line":1321,"updated":"2021-01-19 01:34:02.000000000","message":"The comments in [1] apply here too\n\nhttps://review.opendev.org/c/openstack/ironic/+/768009/7/ironic/objects/node_history.py","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"a9afbedcae2f33e3eeacf840b31f6ffdcc4a6f0b","unresolved":false,"context_lines":[{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"        :param values: Dict of values."},{"line_number":1320,"context_line":"        \"\"\""},{"line_number":1321,"context_line":""},{"line_number":1322,"context_line":"    @abc.abstractmethod"},{"line_number":1323,"context_line":"    def destroy_node_history_by_uuid(self, history_uuid):"},{"line_number":1324,"context_line":"        \"\"\"Destroy a history entry."}],"source_content_type":"text/x-python","patch_set":7,"id":"e5d9c9a8_98ebae27","line":1321,"in_reply_to":"ef86ac45_8f6b51b9","updated":"2021-01-25 20:15:50.000000000","message":"This is needed for the spec","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af2d58d12ccd7dfe59c102f965e409147fa5c18d","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"    def destroy_node_history_by_uuid(self, history_uuid):"},{"line_number":1324,"context_line":"        \"\"\"Destroy a history entry."},{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":"        :param history_uuid: The uuid of a history."},{"line_number":1327,"context_line":"        \"\"\""},{"line_number":1328,"context_line":""},{"line_number":1329,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"257c0c3f_8b681cfc","line":1326,"updated":"2021-02-03 13:13:47.000000000","message":"same here and below","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"}],"ironic/db/sqlalchemy/alembic/versions/9ef41f07cb58_add_node_history_table.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af2d58d12ccd7dfe59c102f965e409147fa5c18d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":36,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255),"},{"line_number":37,"context_line":"                              nullable\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":39,"context_line":"                    sa.Column(\u0027user\u0027, sa.String(length\u003d32), nullable\u003dTrue),"},{"line_number":40,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":41,"context_line":"                    sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"49152734_883557f6","line":38,"updated":"2021-02-03 13:13:47.000000000","message":"I\u0027m not sure if it was the spec (apologies for not raising it earlier then), but can we maybe include a type field with some scripting-friendly identifier? Similar to notifications, e.g. \"node.power.on\"?","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d603531f58a24697802bce515bcde3fef97abcf8","unresolved":true,"context_lines":[{"line_number":32,"context_line":"                    sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":33,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":34,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":35,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":36,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255),"},{"line_number":37,"context_line":"                              nullable\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027event_type\u0027, sa.String(length\u003d255),"}],"source_content_type":"text/x-python","patch_set":9,"id":"e2cdde98_ab918c4a","line":35,"updated":"2021-06-25 14:12:48.000000000","message":"Since we allow query by entry uuid, we likely ought to just index the column so the query planner/optimizer doesn\u0027t try to do anything silly and hopefully the data set gets returned as quickly as possible.","commit_id":"bc77830afdfa2176a69471c2f9e31ce15e074b8c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d603531f58a24697802bce515bcde3fef97abcf8","unresolved":true,"context_lines":[{"line_number":33,"context_line":"                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":34,"context_line":"                    sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":35,"context_line":"                    sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":36,"context_line":"                    sa.Column(\u0027conductor\u0027, sa.String(length\u003d255),"},{"line_number":37,"context_line":"                              nullable\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027event_type\u0027, sa.String(length\u003d255),"},{"line_number":39,"context_line":"                              nullable\u003dTrue),"},{"line_number":40,"context_line":"                    sa.Column(\u0027severity\u0027, sa.String(length\u003d255),"}],"source_content_type":"text/x-python","patch_set":9,"id":"0b72b6ce_970ec784","line":37,"range":{"start_line":36,"start_character":0,"end_line":37,"end_character":45},"updated":"2021-06-25 14:12:48.000000000","message":"it occurs to me that a useful thing would actually be getting errors by conductor.... Which would return a huge record set, but it would be a very effective column to index.","commit_id":"bc77830afdfa2176a69471c2f9e31ce15e074b8c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a1af4fc9dd3ff462f9189dce70ac0797ffdffac0","unresolved":true,"context_lines":[{"line_number":37,"context_line":"                              nullable\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027event_type\u0027, sa.String(length\u003d255),"},{"line_number":39,"context_line":"                              nullable\u003dTrue),"},{"line_number":40,"context_line":"                    sa.Column(\u0027severity\u0027, sa.String(length\u003d255),"},{"line_number":41,"context_line":"                              nullable\u003dTrue),"},{"line_number":42,"context_line":"                    sa.Column(\u0027event\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":43,"context_line":"                    sa.Column(\u0027user\u0027, sa.String(length\u003d32), nullable\u003dTrue),"},{"line_number":44,"context_line":"                    sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":26,"id":"6e5e6074_3ff230b6","line":41,"range":{"start_line":40,"start_character":0,"end_line":41,"end_character":45},"updated":"2021-09-10 13:43:37.000000000","message":"oh, helps that it is already there, but I guess not in the objectmodel.","commit_id":"771e4012d030794b256f0271d747cd408a7320b8"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"8cd46bd8fbe0b033b0f97594841a7cf5bfbe4451","unresolved":true,"context_lines":[{"line_number":2125,"context_line":"            count \u003d query.delete()"},{"line_number":2126,"context_line":"            if count \u003d\u003d 0:"},{"line_number":2127,"context_line":"                raise exception.NodeHistoryNotFound(history\u003dhistory_uuid)"},{"line_number":2128,"context_line":""},{"line_number":2129,"context_line":"    def get_node_history_by_id(self, history_id):"},{"line_number":2130,"context_line":"        query \u003d model_query(models.NodeHistory).filter_by(id\u003dhistory_id)"},{"line_number":2131,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"634a13c4_879cfa32","line":2128,"updated":"2021-01-11 15:24:59.000000000","message":"TODO: history not removed when node is deleted.","commit_id":"9727c630eaf3ca88845146433f28e6f7aa638f31"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af2d58d12ccd7dfe59c102f965e409147fa5c18d","unresolved":false,"context_lines":[{"line_number":2104,"context_line":""},{"line_number":2105,"context_line":"    @oslo_db_api.retry_on_deadlock"},{"line_number":2106,"context_line":"    def create_node_history(self, values):"},{"line_number":2107,"context_line":"        if not values.get(\u0027uuid\u0027):"},{"line_number":2108,"context_line":"            values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":2109,"context_line":""},{"line_number":2110,"context_line":"        history \u003d models.NodeHistory()"}],"source_content_type":"text/x-python","patch_set":7,"id":"10e08616_6dd0b921","line":2107,"updated":"2021-02-03 13:13:47.000000000","message":"We shouldn\u0027t support that, there is no use case for user-provided UUIDs","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d603531f58a24697802bce515bcde3fef97abcf8","unresolved":true,"context_lines":[{"line_number":2119,"context_line":"    @oslo_db_api.retry_on_deadlock"},{"line_number":2120,"context_line":"    def destroy_node_history_by_uuid(self, history_uuid):"},{"line_number":2121,"context_line":"        with _session_for_write():"},{"line_number":2122,"context_line":"            query \u003d model_query(models.NodeHistory).filter_by("},{"line_number":2123,"context_line":"                uuid\u003dhistory_uuid)"},{"line_number":2124,"context_line":"            count \u003d query.delete()"},{"line_number":2125,"context_line":"            if count \u003d\u003d 0:"},{"line_number":2126,"context_line":"                raise exception.NodeHistoryNotFound(history\u003dhistory_uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"d36d3001_6f1c3d96","line":2123,"range":{"start_line":2122,"start_character":0,"end_line":2123,"end_character":34},"updated":"2021-06-25 14:12:48.000000000","message":"If we\u0027re going to query by uuid, then perhaps it should be indexed?","commit_id":"bc77830afdfa2176a69471c2f9e31ce15e074b8c"}],"ironic/db/sqlalchemy/models.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"69a6bf694d993702487ebae0ac98c2b5c580e3c7","unresolved":true,"context_lines":[{"line_number":409,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":410,"context_line":"    uuid \u003d Column(String(36), nullable\u003dFalse)"},{"line_number":411,"context_line":"    conductor \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":412,"context_line":"    event \u003d Column(Text, nullable\u003dTrue)"},{"line_number":413,"context_line":"    user \u003d Column(String(32), nullable\u003dTrue)"},{"line_number":414,"context_line":"    node_id \u003d Column(Integer, ForeignKey(\u0027nodes.id\u0027), nullable\u003dTrue)"},{"line_number":415,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1eb1d6ec_ba36feba","line":412,"updated":"2021-01-27 12:29:55.000000000","message":"How everyone feels about adding a type column, so we can filter them by severity, info, error, etc? Could be an enhancement based on this work.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af2d58d12ccd7dfe59c102f965e409147fa5c18d","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":410,"context_line":"    uuid \u003d Column(String(36), nullable\u003dFalse)"},{"line_number":411,"context_line":"    conductor \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":412,"context_line":"    event \u003d Column(Text, nullable\u003dTrue)"},{"line_number":413,"context_line":"    user \u003d Column(String(32), nullable\u003dTrue)"},{"line_number":414,"context_line":"    node_id \u003d Column(Integer, ForeignKey(\u0027nodes.id\u0027), nullable\u003dTrue)"},{"line_number":415,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"93fdb168_7a1640aa","line":412,"updated":"2021-02-03 13:13:47.000000000","message":"I\u0027d add both a type column (detailed type, see my comment somewhere else) and a severity.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"2aa9a114d03238c80df45783057ab47778402fdb","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":410,"context_line":"    uuid \u003d Column(String(36), nullable\u003dFalse)"},{"line_number":411,"context_line":"    conductor \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":412,"context_line":"    event \u003d Column(Text, nullable\u003dTrue)"},{"line_number":413,"context_line":"    user \u003d Column(String(32), nullable\u003dTrue)"},{"line_number":414,"context_line":"    node_id \u003d Column(Integer, ForeignKey(\u0027nodes.id\u0027), nullable\u003dTrue)"},{"line_number":415,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"b53e343b_10d5d47b","line":412,"in_reply_to":"93fdb168_7a1640aa","updated":"2021-02-07 15:04:44.000000000","message":"Will add a severity field on next update, but not sure what we\u0027ll use type for, there are only two types of events will be recorded as defined in the spec.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"}],"ironic/objects/node_history.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c174879689822dbe7a05f4f9569999387e5bb220","unresolved":true,"context_lines":[{"line_number":36,"context_line":"        \u0027node_id\u0027: object_fields.IntegerField(nullable\u003dTrue),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":40,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":41,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":42,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def get(cls, context, history_ident):"},{"line_number":45,"context_line":"        \"\"\"Get a history based on its id or uuid."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        :param history_ident: The id or uuid of a history."},{"line_number":48,"context_line":"        :param context: Security context"},{"line_number":49,"context_line":"        :returns: A :class:`NodeHistory` object."},{"line_number":50,"context_line":"        :raises: InvalidIdentity"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        \"\"\""},{"line_number":53,"context_line":"        if strutils.is_int_like(history_ident):"},{"line_number":54,"context_line":"            return cls.get_by_id(context, history_ident)"},{"line_number":55,"context_line":"        elif uuidutils.is_uuid_like(history_ident):"},{"line_number":56,"context_line":"            return cls.get_by_uuid(context, history_ident)"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            raise exception.InvalidIdentity(identity\u003dhistory_ident)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":61,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":62,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":63,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":64,"context_line":"    @classmethod"},{"line_number":65,"context_line":"    def get_by_id(cls, context, history_id):"},{"line_number":66,"context_line":"        \"\"\"Get a NodeHistory object by its integer ID."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":69,"context_line":"        :param context: Security context"},{"line_number":70,"context_line":"        :param history_id: The ID of a history."},{"line_number":71,"context_line":"        :returns: A :class:`NodeHistory` object."},{"line_number":72,"context_line":"        :raises: NodeHistoryNotFound"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        db_history \u003d cls.dbapi.get_node_history_by_id(history_id)"},{"line_number":76,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":77,"context_line":"        return history"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":80,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":81,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":82,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def get_by_uuid(cls, context, uuid):"},{"line_number":85,"context_line":"        \"\"\"Get a NodeHistory object by its UUID."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":88,"context_line":"        :param context: Security context"},{"line_number":89,"context_line":"        :param uuid: The UUID of a NodeHistory."},{"line_number":90,"context_line":"        :returns: A :class:`NodeHistory` object."},{"line_number":91,"context_line":"        :raises: NodeHistoryNotFound"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        db_history \u003d cls.dbapi.get_node_history_by_uuid(uuid)"},{"line_number":95,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":96,"context_line":"        return history"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":99,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."}],"source_content_type":"text/x-python","patch_set":7,"id":"2c378ef8_6ba2a50d","line":96,"range":{"start_line":39,"start_character":0,"end_line":96,"end_character":22},"updated":"2021-01-19 01:34:02.000000000","message":"I\u0027d like to suggest that a NodeHistory record is a lightweight log record which never needs to be accessed individually, and is only accessed via list_by_node_id. If that is agreed, are these get functions required?","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"a9afbedcae2f33e3eeacf840b31f6ffdcc4a6f0b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027node_id\u0027: object_fields.IntegerField(nullable\u003dTrue),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":40,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":41,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":42,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def get(cls, context, history_ident):"},{"line_number":45,"context_line":"        \"\"\"Get a history based on its id or uuid."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        :param history_ident: The id or uuid of a history."},{"line_number":48,"context_line":"        :param context: Security context"},{"line_number":49,"context_line":"        :returns: A :class:`NodeHistory` object."},{"line_number":50,"context_line":"        :raises: InvalidIdentity"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        \"\"\""},{"line_number":53,"context_line":"        if strutils.is_int_like(history_ident):"},{"line_number":54,"context_line":"            return cls.get_by_id(context, history_ident)"},{"line_number":55,"context_line":"        elif uuidutils.is_uuid_like(history_ident):"},{"line_number":56,"context_line":"            return cls.get_by_uuid(context, history_ident)"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            raise exception.InvalidIdentity(identity\u003dhistory_ident)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":61,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":62,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":63,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":64,"context_line":"    @classmethod"},{"line_number":65,"context_line":"    def get_by_id(cls, context, history_id):"},{"line_number":66,"context_line":"        \"\"\"Get a NodeHistory object by its integer ID."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":69,"context_line":"        :param context: Security context"},{"line_number":70,"context_line":"        :param history_id: The ID of a history."},{"line_number":71,"context_line":"        :returns: A :class:`NodeHistory` object."},{"line_number":72,"context_line":"        :raises: NodeHistoryNotFound"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        db_history \u003d cls.dbapi.get_node_history_by_id(history_id)"},{"line_number":76,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":77,"context_line":"        return history"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":80,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":81,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":82,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def get_by_uuid(cls, context, uuid):"},{"line_number":85,"context_line":"        \"\"\"Get a NodeHistory object by its UUID."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":88,"context_line":"        :param context: Security context"},{"line_number":89,"context_line":"        :param uuid: The UUID of a NodeHistory."},{"line_number":90,"context_line":"        :returns: A :class:`NodeHistory` object."},{"line_number":91,"context_line":"        :raises: NodeHistoryNotFound"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        db_history \u003d cls.dbapi.get_node_history_by_uuid(uuid)"},{"line_number":95,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":96,"context_line":"        return history"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":99,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."}],"source_content_type":"text/x-python","patch_set":7,"id":"d484ca0c_3c965438","line":96,"range":{"start_line":39,"start_character":0,"end_line":96,"end_character":22},"in_reply_to":"2c378ef8_6ba2a50d","updated":"2021-01-25 20:15:50.000000000","message":"This is needed for the spec","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c174879689822dbe7a05f4f9569999387e5bb220","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":96,"context_line":"        return history"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":99,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":100,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":101,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":102,"context_line":"    @classmethod"},{"line_number":103,"context_line":"    def list(cls, context, limit\u003dNone, marker\u003dNone, sort_key\u003dNone,"},{"line_number":104,"context_line":"             sort_dir\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Return a list of NodeHistory objects."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":108,"context_line":"        :param context: Security context."},{"line_number":109,"context_line":"        :param limit: Maximum number of resources to return in a single result."},{"line_number":110,"context_line":"        :param marker: Pagination marker for large data sets."},{"line_number":111,"context_line":"        :param sort_key: Column to sort results by."},{"line_number":112,"context_line":"        :param sort_dir: Direction to sort. \"asc\" or \"desc\"."},{"line_number":113,"context_line":"        :returns: A list of :class:`NodeHistory` object."},{"line_number":114,"context_line":"        :raises: InvalidParameterValue"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        db_histories \u003d cls.dbapi.get_node_history_list(limit\u003dlimit,"},{"line_number":118,"context_line":"                                                       marker\u003dmarker,"},{"line_number":119,"context_line":"                                                       sort_key\u003dsort_key,"},{"line_number":120,"context_line":"                                                       sort_dir\u003dsort_dir)"},{"line_number":121,"context_line":"        return cls._from_db_object_list(context, db_histories)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":124,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."}],"source_content_type":"text/x-python","patch_set":7,"id":"f32dca63_112b58b3","line":121,"range":{"start_line":98,"start_character":0,"end_line":121,"end_character":62},"updated":"2021-01-19 01:34:02.000000000","message":"What is the use-case for fetching every history record for every node? If there isn\u0027t one yet, lets not add this function. It can always be added later.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"69a6bf694d993702487ebae0ac98c2b5c580e3c7","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":96,"context_line":"        return history"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":99,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":100,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":101,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":102,"context_line":"    @classmethod"},{"line_number":103,"context_line":"    def list(cls, context, limit\u003dNone, marker\u003dNone, sort_key\u003dNone,"},{"line_number":104,"context_line":"             sort_dir\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Return a list of NodeHistory objects."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":108,"context_line":"        :param context: Security context."},{"line_number":109,"context_line":"        :param limit: Maximum number of resources to return in a single result."},{"line_number":110,"context_line":"        :param marker: Pagination marker for large data sets."},{"line_number":111,"context_line":"        :param sort_key: Column to sort results by."},{"line_number":112,"context_line":"        :param sort_dir: Direction to sort. \"asc\" or \"desc\"."},{"line_number":113,"context_line":"        :returns: A list of :class:`NodeHistory` object."},{"line_number":114,"context_line":"        :raises: InvalidParameterValue"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        db_histories \u003d cls.dbapi.get_node_history_list(limit\u003dlimit,"},{"line_number":118,"context_line":"                                                       marker\u003dmarker,"},{"line_number":119,"context_line":"                                                       sort_key\u003dsort_key,"},{"line_number":120,"context_line":"                                                       sort_dir\u003dsort_dir)"},{"line_number":121,"context_line":"        return cls._from_db_object_list(context, db_histories)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":124,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."}],"source_content_type":"text/x-python","patch_set":7,"id":"5f978667_0694ca1e","line":121,"range":{"start_line":98,"start_character":0,"end_line":121,"end_character":62},"in_reply_to":"8d51e511_43f697b7","updated":"2021-01-27 12:29:55.000000000","message":"No worries, I\u0027ll update the story to include the spec link.\nThe storyboard actually recorded the spec patch, but not in an obvious way :(","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"a9afbedcae2f33e3eeacf840b31f6ffdcc4a6f0b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":96,"context_line":"        return history"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":99,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":100,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":101,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":102,"context_line":"    @classmethod"},{"line_number":103,"context_line":"    def list(cls, context, limit\u003dNone, marker\u003dNone, sort_key\u003dNone,"},{"line_number":104,"context_line":"             sort_dir\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Return a list of NodeHistory objects."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":108,"context_line":"        :param context: Security context."},{"line_number":109,"context_line":"        :param limit: Maximum number of resources to return in a single result."},{"line_number":110,"context_line":"        :param marker: Pagination marker for large data sets."},{"line_number":111,"context_line":"        :param sort_key: Column to sort results by."},{"line_number":112,"context_line":"        :param sort_dir: Direction to sort. \"asc\" or \"desc\"."},{"line_number":113,"context_line":"        :returns: A list of :class:`NodeHistory` object."},{"line_number":114,"context_line":"        :raises: InvalidParameterValue"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        db_histories \u003d cls.dbapi.get_node_history_list(limit\u003dlimit,"},{"line_number":118,"context_line":"                                                       marker\u003dmarker,"},{"line_number":119,"context_line":"                                                       sort_key\u003dsort_key,"},{"line_number":120,"context_line":"                                                       sort_dir\u003dsort_dir)"},{"line_number":121,"context_line":"        return cls._from_db_object_list(context, db_histories)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":124,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."}],"source_content_type":"text/x-python","patch_set":7,"id":"8d51e511_43f697b7","line":121,"range":{"start_line":98,"start_character":0,"end_line":121,"end_character":62},"in_reply_to":"92684076_473ae055","updated":"2021-01-25 20:15:50.000000000","message":"Ah, the story doesn\u0027t link to the spec so I wasn\u0027t aware it even existed, I had just assumed the story was a lightweight spec where the details would be worked out in the reviews.\n\nCould you please add a link to the spec from the story?","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6044e2dac2b1e464983dfe6bac0280ea3b27f125","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        history \u003d cls._from_db_object(context, cls(), db_history)"},{"line_number":96,"context_line":"        return history"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":99,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":100,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":101,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":102,"context_line":"    @classmethod"},{"line_number":103,"context_line":"    def list(cls, context, limit\u003dNone, marker\u003dNone, sort_key\u003dNone,"},{"line_number":104,"context_line":"             sort_dir\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Return a list of NodeHistory objects."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :param cls: the :class:`NodeHistory`"},{"line_number":108,"context_line":"        :param context: Security context."},{"line_number":109,"context_line":"        :param limit: Maximum number of resources to return in a single result."},{"line_number":110,"context_line":"        :param marker: Pagination marker for large data sets."},{"line_number":111,"context_line":"        :param sort_key: Column to sort results by."},{"line_number":112,"context_line":"        :param sort_dir: Direction to sort. \"asc\" or \"desc\"."},{"line_number":113,"context_line":"        :returns: A list of :class:`NodeHistory` object."},{"line_number":114,"context_line":"        :raises: InvalidParameterValue"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        db_histories \u003d cls.dbapi.get_node_history_list(limit\u003dlimit,"},{"line_number":118,"context_line":"                                                       marker\u003dmarker,"},{"line_number":119,"context_line":"                                                       sort_key\u003dsort_key,"},{"line_number":120,"context_line":"                                                       sort_dir\u003dsort_dir)"},{"line_number":121,"context_line":"        return cls._from_db_object_list(context, db_histories)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":124,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."}],"source_content_type":"text/x-python","patch_set":7,"id":"92684076_473ae055","line":121,"range":{"start_line":98,"start_character":0,"end_line":121,"end_character":62},"in_reply_to":"f32dca63_112b58b3","updated":"2021-01-25 15:14:55.000000000","message":"Returning all history entries is to provide something like recent activities, this is required to support the CLI defined in the spec https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/node-history.html#openstack-baremetal-cli","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c174879689822dbe7a05f4f9569999387e5bb220","unresolved":true,"context_lines":[{"line_number":163,"context_line":"        db_history \u003d self.dbapi.create_node_history(values)"},{"line_number":164,"context_line":"        self._from_db_object(self._context, self, db_history)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":167,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":168,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":169,"context_line":"    # @object_base.remotable"},{"line_number":170,"context_line":"    def destroy(self, context\u003dNone):"},{"line_number":171,"context_line":"        \"\"\"Delete the NodeHistory from the DB."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :param context: Security context. NOTE: This should only"},{"line_number":174,"context_line":"                        be used internally by the indirection_api."},{"line_number":175,"context_line":"                        Unfortunately, RPC requires context as the first"},{"line_number":176,"context_line":"                        argument, even though we don\u0027t use it."},{"line_number":177,"context_line":"                        A context should be set when instantiating the"},{"line_number":178,"context_line":"                        object, e.g.: NodeHistory(context)"},{"line_number":179,"context_line":"        :raises: NodeHistoryNotFound"},{"line_number":180,"context_line":"        \"\"\""},{"line_number":181,"context_line":"        self.dbapi.destroy_node_history_by_uuid(self.uuid)"},{"line_number":182,"context_line":"        self.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":7,"id":"6cd54cc8_2c1ca049","line":182,"range":{"start_line":166,"start_character":0,"end_line":182,"end_character":32},"updated":"2021-01-19 01:34:02.000000000","message":"Given the above comments, this should be a class method destroy_by_node_id.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"a9afbedcae2f33e3eeacf840b31f6ffdcc4a6f0b","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        db_history \u003d self.dbapi.create_node_history(values)"},{"line_number":164,"context_line":"        self._from_db_object(self._context, self, db_history)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":167,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":168,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":169,"context_line":"    # @object_base.remotable"},{"line_number":170,"context_line":"    def destroy(self, context\u003dNone):"},{"line_number":171,"context_line":"        \"\"\"Delete the NodeHistory from the DB."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :param context: Security context. NOTE: This should only"},{"line_number":174,"context_line":"                        be used internally by the indirection_api."},{"line_number":175,"context_line":"                        Unfortunately, RPC requires context as the first"},{"line_number":176,"context_line":"                        argument, even though we don\u0027t use it."},{"line_number":177,"context_line":"                        A context should be set when instantiating the"},{"line_number":178,"context_line":"                        object, e.g.: NodeHistory(context)"},{"line_number":179,"context_line":"        :raises: NodeHistoryNotFound"},{"line_number":180,"context_line":"        \"\"\""},{"line_number":181,"context_line":"        self.dbapi.destroy_node_history_by_uuid(self.uuid)"},{"line_number":182,"context_line":"        self.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9dbd786f_4f8e0bfa","line":182,"range":{"start_line":166,"start_character":0,"end_line":182,"end_character":32},"in_reply_to":"1e7db896_3ab837a0","updated":"2021-01-25 20:15:50.000000000","message":"ack","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6044e2dac2b1e464983dfe6bac0280ea3b27f125","unresolved":true,"context_lines":[{"line_number":163,"context_line":"        db_history \u003d self.dbapi.create_node_history(values)"},{"line_number":164,"context_line":"        self._from_db_object(self._context, self, db_history)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"},{"line_number":167,"context_line":"    # methods can be used in the future to replace current explicit RPC calls."},{"line_number":168,"context_line":"    # Implications of calling new remote procedures should be thought through."},{"line_number":169,"context_line":"    # @object_base.remotable"},{"line_number":170,"context_line":"    def destroy(self, context\u003dNone):"},{"line_number":171,"context_line":"        \"\"\"Delete the NodeHistory from the DB."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :param context: Security context. NOTE: This should only"},{"line_number":174,"context_line":"                        be used internally by the indirection_api."},{"line_number":175,"context_line":"                        Unfortunately, RPC requires context as the first"},{"line_number":176,"context_line":"                        argument, even though we don\u0027t use it."},{"line_number":177,"context_line":"                        A context should be set when instantiating the"},{"line_number":178,"context_line":"                        object, e.g.: NodeHistory(context)"},{"line_number":179,"context_line":"        :raises: NodeHistoryNotFound"},{"line_number":180,"context_line":"        \"\"\""},{"line_number":181,"context_line":"        self.dbapi.destroy_node_history_by_uuid(self.uuid)"},{"line_number":182,"context_line":"        self.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1e7db896_3ab837a0","line":182,"range":{"start_line":166,"start_character":0,"end_line":182,"end_character":32},"in_reply_to":"6cd54cc8_2c1ca049","updated":"2021-01-25 15:14:55.000000000","message":"node history is considered immutable once created, so the removal of rows will be handled at destroy node.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"9d5a56bed6468ab17692c24c612c8cc78d8cc361","unresolved":true,"context_lines":[{"line_number":33,"context_line":"        \u0027conductor\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027event\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027user\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027node_id\u0027: object_fields.IntegerField(nullable\u003dTrue),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"}],"source_content_type":"text/x-python","patch_set":26,"id":"3aad2711_8c504d14","line":36,"updated":"2021-09-09 02:25:58.000000000","message":"We could include severity here since they\u0027re in the db api model, and I\u0027ve got comments in this series which could make it useful","commit_id":"771e4012d030794b256f0271d747cd408a7320b8"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9aac8e260c4a87ba32cbd3140490358328e01d59","unresolved":true,"context_lines":[{"line_number":33,"context_line":"        \u0027conductor\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027event\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027user\u0027: object_fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027node_id\u0027: object_fields.IntegerField(nullable\u003dTrue),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    # NOTE(xek): We don\u0027t want to enable RPC on this call just yet. Remotable"}],"source_content_type":"text/x-python","patch_set":26,"id":"461f4ea6_52ac2885","line":36,"in_reply_to":"3aad2711_8c504d14","updated":"2021-09-09 16:16:01.000000000","message":"I raised this question in IRC earlier today and consensus was to add severity as well.","commit_id":"771e4012d030794b256f0271d747cd408a7320b8"}],"ironic/tests/unit/db/utils.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c174879689822dbe7a05f4f9569999387e5bb220","unresolved":true,"context_lines":[{"line_number":683,"context_line":"        \u0027conductor\u0027: kw.get(\u0027conductor\u0027, \u0027host-1\u0027),"},{"line_number":684,"context_line":"        \u0027user\u0027: kw.get(\u0027user\u0027, \u0027fake-user\u0027),"},{"line_number":685,"context_line":"        \u0027created_at\u0027: kw.get(\u0027created_at\u0027),"},{"line_number":686,"context_line":"        \u0027updated_at\u0027: kw.get(\u0027updated_at\u0027),"},{"line_number":687,"context_line":"    }"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"28486b41_fb1fc08a","line":686,"range":{"start_line":686,"start_character":8,"end_line":686,"end_character":43},"updated":"2021-01-19 01:34:02.000000000","message":"history records will be immutable, so updated_at will always be None, lets not expose it for tests.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"a9afbedcae2f33e3eeacf840b31f6ffdcc4a6f0b","unresolved":false,"context_lines":[{"line_number":683,"context_line":"        \u0027conductor\u0027: kw.get(\u0027conductor\u0027, \u0027host-1\u0027),"},{"line_number":684,"context_line":"        \u0027user\u0027: kw.get(\u0027user\u0027, \u0027fake-user\u0027),"},{"line_number":685,"context_line":"        \u0027created_at\u0027: kw.get(\u0027created_at\u0027),"},{"line_number":686,"context_line":"        \u0027updated_at\u0027: kw.get(\u0027updated_at\u0027),"},{"line_number":687,"context_line":"    }"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ea2d69b6_e7a95e0d","line":686,"range":{"start_line":686,"start_character":8,"end_line":686,"end_character":43},"in_reply_to":"1349f026_91e3b0f7","updated":"2021-01-25 20:15:50.000000000","message":"Ack","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6044e2dac2b1e464983dfe6bac0280ea3b27f125","unresolved":true,"context_lines":[{"line_number":683,"context_line":"        \u0027conductor\u0027: kw.get(\u0027conductor\u0027, \u0027host-1\u0027),"},{"line_number":684,"context_line":"        \u0027user\u0027: kw.get(\u0027user\u0027, \u0027fake-user\u0027),"},{"line_number":685,"context_line":"        \u0027created_at\u0027: kw.get(\u0027created_at\u0027),"},{"line_number":686,"context_line":"        \u0027updated_at\u0027: kw.get(\u0027updated_at\u0027),"},{"line_number":687,"context_line":"    }"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1349f026_91e3b0f7","line":686,"range":{"start_line":686,"start_character":8,"end_line":686,"end_character":43},"in_reply_to":"28486b41_fb1fc08a","updated":"2021-01-25 15:14:55.000000000","message":"AFAIK updated_at will have the same value as created_at when created, this is just following a standard way, there is no need to do it in a different way even we don\u0027t use it.","commit_id":"67591d27be158686977f0b78c3654a53565f92f1"}]}
