)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"9fa823b0fa35825ae49351a8af6936eae33e333f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Rodolfo Alonso Hernandez \u003cralonsoh@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-27 10:34:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[OVN] Add DB tables for OVN backend"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added \"ovn_revision_numbers\" and \"ovn_hash_ring\" DB tables and models."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_fd26c722","line":7,"range":{"start_line":7,"start_character":24,"end_line":7,"end_character":27},"updated":"2019-11-28 11:17:20.000000000","message":"Nit:\nI noticed Slawek uses networking-ovn for some patches, so this is for networking-ovn, not OVN itself right? I don\u0027t know if we have a consensus name to distinguish eatch. : )","commit_id":"cd8921d674ed255859eaa6477fb573198edeae72"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"75804aad413a84a5f17fc468d6855fa5adb12ed8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Rodolfo Alonso Hernandez \u003cralonsoh@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-27 10:34:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[OVN] Add DB tables for OVN backend"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added \"ovn_revision_numbers\" and \"ovn_hash_ring\" DB tables and models."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_e51aad7a","line":7,"range":{"start_line":7,"start_character":24,"end_line":7,"end_character":27},"in_reply_to":"3fa7e38b_a55a75ef","updated":"2019-11-28 14:16:18.000000000","message":"When we talk about backend names, we use capital letters, like Linux Bridge, OVS, SR-IOV, etc.","commit_id":"cd8921d674ed255859eaa6477fb573198edeae72"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fa1c6a91950408efb27c255070dd6b13df918e8a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Rodolfo Alonso Hernandez \u003cralonsoh@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-27 10:34:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[OVN] Add DB tables for OVN backend"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added \"ovn_revision_numbers\" and \"ovn_hash_ring\" DB tables and models."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_a55a75ef","line":7,"range":{"start_line":7,"start_character":24,"end_line":7,"end_character":27},"in_reply_to":"3fa7e38b_fd26c722","updated":"2019-11-28 13:43:56.000000000","message":"I think that simple \"ovn\" is good choice for new name as it is similar pattern like e.g. for openvswitch or linuxbridge driver. Those aren\u0027t named like networking-openvswitch.","commit_id":"cd8921d674ed255859eaa6477fb573198edeae72"}],"neutron/db/migration/alembic_migrations/versions/ussuri/expand/f4b9654dd40c_ovn_backend.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c0efb355d957b800e304c4f32e3d3cd6ed82b046","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":68,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":69,"context_line":"        sa.PrimaryKeyConstraint(\u0027node_uuid\u0027, \u0027group_name\u0027),"},{"line_number":70,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_cac0f52e","line":70,"updated":"2019-11-27 10:08:36.000000000","message":"Can we make the logic here a bit smarter and check if those tables exist in the database first before attempting to create it ?\n\nOtherwise people migrating from networking-ovn to neutron ovn will bump into:\n\n2019-11-26 20:52:52.221556 | controller | pymysql.err.InternalError: (1050, \"Table \u0027ovn_revision_numbers\u0027 already exists\")","commit_id":"54ed2c80494884a47117b874992a0d87edc2df49"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e9fac2f9eb57f547b32219d6d66f19ebab6c42c5","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":68,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":69,"context_line":"        sa.PrimaryKeyConstraint(\u0027node_uuid\u0027, \u0027group_name\u0027),"},{"line_number":70,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_8548ae62","line":70,"in_reply_to":"3fa7e38b_8a743d06","updated":"2019-11-27 10:32:51.000000000","message":"Oh right, ok... The ovn job (in neutron) is currently failing with the error I\u0027ve just copy and pasted.\n\nMaybe we will need to make it non-voting while we migrate the code ?\n\nWe do not have that logic to skip creating the tables if they already exist there.","commit_id":"54ed2c80494884a47117b874992a0d87edc2df49"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"538b0a5ae7e0533e689a706a88a0817d18514845","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":68,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":69,"context_line":"        sa.PrimaryKeyConstraint(\u0027node_uuid\u0027, \u0027group_name\u0027),"},{"line_number":70,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_8a743d06","line":70,"in_reply_to":"3fa7e38b_cac0f52e","updated":"2019-11-27 10:23:12.000000000","message":"This logic in implemented in L40.\n\nIf you try to execute manually \"neutron-db-manage upgrade heads\", this script will also try to apply networking-ovn heads and this create this clash. If you skip networking-ovn (from this point won\u0027t be needed), the migration is done correctly.","commit_id":"54ed2c80494884a47117b874992a0d87edc2df49"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"9fa823b0fa35825ae49351a8af6936eae33e333f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger, nullable\u003dTrue),"},{"line_number":46,"context_line":"        sa.Column(\u0027resource_uuid\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":47,"context_line":"        sa.Column(\u0027resource_type\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":48,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger, nullable\u003dFalse, default\u003d0),"},{"line_number":49,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":50,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":51,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.TIMESTAMP, default\u003dsa.func.now(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_9d20f3fa","line":48,"range":{"start_line":48,"start_character":68,"end_line":48,"end_character":77},"updated":"2019-11-28 11:17:20.000000000","message":"This should be server_default\u003d\u00270\u0027:\nhttps://github.com/openstack/neutron/blob/master/neutron/db/migration/alembic_migrations/versions/newton/expand/c415aab1c048_add_revisions_column.py#L35","commit_id":"cd8921d674ed255859eaa6477fb573198edeae72"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"75804aad413a84a5f17fc468d6855fa5adb12ed8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger, nullable\u003dTrue),"},{"line_number":46,"context_line":"        sa.Column(\u0027resource_uuid\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":47,"context_line":"        sa.Column(\u0027resource_type\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":48,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger, nullable\u003dFalse, default\u003d0),"},{"line_number":49,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":50,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":51,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.TIMESTAMP, default\u003dsa.func.now(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_a53b55e8","line":48,"range":{"start_line":48,"start_character":68,"end_line":48,"end_character":77},"in_reply_to":"3fa7e38b_9d20f3fa","updated":"2019-11-28 14:16:18.000000000","message":"You are right!","commit_id":"cd8921d674ed255859eaa6477fb573198edeae72"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9672b1bfb0f5abd0b0987e7d43522b96f974e0ea","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger, nullable\u003dTrue),"},{"line_number":46,"context_line":"        sa.Column(\u0027resource_uuid\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":47,"context_line":"        sa.Column(\u0027resource_type\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":48,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger, nullable\u003dFalse, default\u003d0),"},{"line_number":49,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":50,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":51,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.TIMESTAMP, default\u003dsa.func.now(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_c885480c","line":48,"range":{"start_line":48,"start_character":68,"end_line":48,"end_character":77},"in_reply_to":"3fa7e38b_a53b55e8","updated":"2019-11-28 14:48:14.000000000","message":"This is how it is done now in networking-ovn. And because of that we should stay with this like that here and maybe add follow up patch with another db migration which will set properly default value on db level.\n\nIf we will change it now we will end up with 2 different db schemas in Ussur.\n\n1. Deployment on Train with installed networking-ovn already, so in database there is ovn_revision_numbers table without default value set. Our script checks that table already exists so will do nothing and on Ussuri in db there will be still no default value,\n\n2. New deployment or deployment on Train without networking-ovn installed. This alembic script will check that ovn_revision_number don\u0027t exists so it will create it from scratch. If we will set here \"server_default\" instead of \"default\" than in db on Ussuri we will have set default value for this column.\n\nWe should be really careful and avoid any of such differences between db schema in those 2 variants so lets do it now like it is, even if it\u0027s wrong and than propose follow-up patch with another db upgrade script to fix it.","commit_id":"cd8921d674ed255859eaa6477fb573198edeae72"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4957fee3e8f533ea269ee54c1911af082560ce7f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger, nullable\u003dTrue),"},{"line_number":46,"context_line":"        sa.Column(\u0027resource_uuid\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":47,"context_line":"        sa.Column(\u0027resource_type\u0027, sa.String(36), nullable\u003dFalse, index\u003dTrue),"},{"line_number":48,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger, nullable\u003dFalse, default\u003d0),"},{"line_number":49,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":50,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":51,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.TIMESTAMP, default\u003dsa.func.now(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_68c45442","line":48,"range":{"start_line":48,"start_character":68,"end_line":48,"end_character":77},"in_reply_to":"3fa7e38b_c885480c","updated":"2019-11-28 14:56:43.000000000","message":"You are right, we need to keep synchronized the DB schema, regardless of the path taken (new installation or upgrade from networking-ovn).\n\nTo have this default value in \"revision_number\" in the existing tables, I\u0027ll add the needed code to alter this field.","commit_id":"cd8921d674ed255859eaa6477fb573198edeae72"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c220814dc0b6e9880dfaabf94111cfb60f01bd0f","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger, nullable\u003dFalse,"},{"line_number":52,"context_line":"                  server_default\u003d\u00270\u0027),"},{"line_number":53,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":54,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":55,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.TIMESTAMP, default\u003dsa.func.now(),"},{"line_number":56,"context_line":"                  onupdate\u003dsa.func.now(), nullable\u003dTrue),"},{"line_number":57,"context_line":"        sa.ForeignKeyConstraint("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_3400f102","line":54,"range":{"start_line":54,"start_character":18,"end_line":54,"end_character":25},"updated":"2019-11-28 21:39:55.000000000","message":"what about this?","commit_id":"5efbac421db1417d450bad24f118de74be7340ac"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"563a935c19f516d8818b3625779479392b8debf7","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        sa.Column(\u0027revision_number\u0027, sa.BigInteger, nullable\u003dFalse,"},{"line_number":52,"context_line":"                  server_default\u003d\u00270\u0027),"},{"line_number":53,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":54,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":55,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.TIMESTAMP, default\u003dsa.func.now(),"},{"line_number":56,"context_line":"                  onupdate\u003dsa.func.now(), nullable\u003dTrue),"},{"line_number":57,"context_line":"        sa.ForeignKeyConstraint("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_cf9b0362","line":54,"range":{"start_line":54,"start_character":18,"end_line":54,"end_character":25},"in_reply_to":"3fa7e38b_3400f102","updated":"2019-11-29 14:51:34.000000000","message":"This value (and the other ones), do not have a DB backend enforced value, but can\u0027t be False.\n\nBy default, when a Python model object is created, the default value assigned to this object will be the current time. If the python code does NOT pass a value in this field, the DB backend will complain.","commit_id":"5efbac421db1417d450bad24f118de74be7340ac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c220814dc0b6e9880dfaabf94111cfb60f01bd0f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                  server_default\u003d\u00270\u0027),"},{"line_number":53,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":54,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":55,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.TIMESTAMP, default\u003dsa.func.now(),"},{"line_number":56,"context_line":"                  onupdate\u003dsa.func.now(), nullable\u003dTrue),"},{"line_number":57,"context_line":"        sa.ForeignKeyConstraint("},{"line_number":58,"context_line":"            [\u0027standard_attr_id\u0027], [\u0027standardattributes.id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_3afbfb15","line":55,"range":{"start_line":55,"start_character":46,"end_line":55,"end_character":53},"updated":"2019-11-28 21:39:55.000000000","message":"and this?","commit_id":"5efbac421db1417d450bad24f118de74be7340ac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c220814dc0b6e9880dfaabf94111cfb60f01bd0f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                  index\u003dTrue),"},{"line_number":68,"context_line":"        sa.Column(\u0027hostname\u0027, sa.String(length\u003d256), nullable\u003dFalse),"},{"line_number":69,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":70,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":71,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":72,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":73,"context_line":"        sa.PrimaryKeyConstraint(\u0027node_uuid\u0027, \u0027group_name\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_fa048316","line":70,"range":{"start_line":70,"start_character":18,"end_line":70,"end_character":25},"updated":"2019-11-28 21:39:55.000000000","message":"and this","commit_id":"5efbac421db1417d450bad24f118de74be7340ac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c220814dc0b6e9880dfaabf94111cfb60f01bd0f","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":70,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":71,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime, nullable\u003dFalse,"},{"line_number":72,"context_line":"                  default\u003dsa.func.now()),"},{"line_number":73,"context_line":"        sa.PrimaryKeyConstraint(\u0027node_uuid\u0027, \u0027group_name\u0027),"},{"line_number":74,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_1a0abf1f","line":72,"range":{"start_line":72,"start_character":18,"end_line":72,"end_character":25},"updated":"2019-11-28 21:39:55.000000000","message":"and this","commit_id":"5efbac421db1417d450bad24f118de74be7340ac"}],"neutron/db/migration/alembic_migrations/versions/ussuri/expand/f4b9654dd40c_ovs_backend.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f793b58702f82548438700a9dda8f60d317a0d3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2019 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_4a0f378b","line":1,"updated":"2019-11-26 11:28:30.000000000","message":"file name: ...ovn_backend","commit_id":"ca7e0382879f968aefdccf534bb6314e29cc6939"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f793b58702f82548438700a9dda8f60d317a0d3","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from sqlalchemy.engine import reflection"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"\"\"\"ovs backend"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Revision ID: f4b9654dd40c"},{"line_number":24,"context_line":"Revises: 86274d77933e"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_2a351b46","line":21,"range":{"start_line":21,"start_character":3,"end_line":21,"end_character":6},"updated":"2019-11-26 11:28:30.000000000","message":"ovn","commit_id":"ca7e0382879f968aefdccf534bb6314e29cc6939"}]}
