)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kevin Benton \u003cblak111@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-15 16:23:24 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Network RBAC DB setup and legacy migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch implements the database model required for the network"},{"line_number":10,"context_line":"RBAC work. In addition it migrates the current network and subnet"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"9a41bdd9_9fb41383","line":7,"updated":"2015-07-16 14:44:04.000000000","message":"how legacy is it now?","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8a4d90412dba78f5690810462a9e7d13499df7ed","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kevin Benton \u003cblak111@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-15 16:23:24 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Network RBAC DB setup and legacy migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch implements the database model required for the network"},{"line_number":10,"context_line":"RBAC work. In addition it migrates the current network and subnet"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"9a41bdd9_4ae787ac","line":7,"in_reply_to":"9a41bdd9_9fb41383","updated":"2015-07-17 07:04:05.000000000","message":"legacy refers to the \u0027shared\u0027 attribute, not the migration itself.","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":15,"context_line":"this is the same (tenants will see networks as \u0027shared\u003dTrue\u0027 if the"},{"line_number":16,"context_line":"network is shared with them). However, internal callers (e.g. plugins,"},{"line_number":17,"context_line":"drivers, services) will not be able to check for the \u0027shared\u0027 attribute"},{"line_number":18,"context_line":"on network and subnet db objects any more."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This patch just achieves parity with the current shared behavior so it"},{"line_number":21,"context_line":"doesn\u0027t add the ability to manipulate the RBAC entries directly. The"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"9a41bdd9_9f3973f5","line":18,"updated":"2015-07-16 14:44:04.000000000","message":"should we mention it in doc/source/devref/neutron_api.rst ?","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8a4d90412dba78f5690810462a9e7d13499df7ed","unresolved":false,"context_lines":[{"line_number":15,"context_line":"this is the same (tenants will see networks as \u0027shared\u003dTrue\u0027 if the"},{"line_number":16,"context_line":"network is shared with them). However, internal callers (e.g. plugins,"},{"line_number":17,"context_line":"drivers, services) will not be able to check for the \u0027shared\u0027 attribute"},{"line_number":18,"context_line":"on network and subnet db objects any more."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This patch just achieves parity with the current shared behavior so it"},{"line_number":21,"context_line":"doesn\u0027t add the ability to manipulate the RBAC entries directly. The"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"9a41bdd9_4a9ea708","line":18,"in_reply_to":"9a41bdd9_9f3973f5","updated":"2015-07-17 07:04:05.000000000","message":"yes, i\u0027ll do this in a follow-up patch","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import functools"},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_db import exception as db_exc"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_224a9056","line":16,"updated":"2015-07-16 14:44:04.000000000","message":"nit: it\u0027s stdlib, so should have been split with newline","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8a4d90412dba78f5690810462a9e7d13499df7ed","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import functools"},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_db import exception as db_exc"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_f55e7c11","line":16,"in_reply_to":"9a41bdd9_224a9056","updated":"2015-07-17 07:04:05.000000000","message":"Done","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"}],"neutron/db/migration/alembic_migrations/versions/8675309a5c4f_rbac_network.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"aa82275de357199507d219ef01b46547eaf1ff8a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"insert into networkrbacs \""},{"line_number":33,"context_line":"    \"select networks.id as object_id, \u0027*\u0027 as tenant, \""},{"line_number":34,"context_line":"    \"\u0027access_as_shared\u0027 as action from networks \""},{"line_number":35,"context_line":"    \"where shared !\u003d 0\""},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_afaada17","line":35,"updated":"2015-06-15 12:28:02.000000000","message":"This won\u0027t work for PostgreSQL as boolean is True or False there, not 1 or 0. http://paste.openstack.org/show/293953/","commit_id":"67a914e35ba24cffa4164bc7c6b0d5982ed037d2"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"17ac02c67cef7fe0eed489d10354c272d08fab4b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"insert into networkrbacs \""},{"line_number":33,"context_line":"    \"select networks.id as object_id, \u0027*\u0027 as tenant, \""},{"line_number":34,"context_line":"    \"\u0027access_as_shared\u0027 as action from networks \""},{"line_number":35,"context_line":"    \"where shared !\u003d 0\""},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_ccd08956","line":35,"in_reply_to":"fa32b979_afaada17","updated":"2015-06-15 13:01:09.000000000","message":"thanks. good catch.","commit_id":"67a914e35ba24cffa4164bc7c6b0d5982ed037d2"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"06bbb71f983fd05ee290f3a84874e5486967b213","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    table \u003d op.create_table("},{"line_number":45,"context_line":"        \u0027networkrbacs\u0027,"},{"line_number":46,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse,"},{"line_number":47,"context_line":"                  default\u003duuidutils.generate_uuid),"},{"line_number":48,"context_line":"        sa.Column(\u0027object_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":50,"context_line":"        sa.Column(\u0027target_tenant\u0027, sa.String(length\u003d255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_c701db06","line":47,"updated":"2015-06-17 10:51:57.000000000","message":"default is useless in migration, use server_default instead http://docs.openstack.org/developer/neutron/devref/db_layer.html#difference-between-default-and-server-default-parameters-for-columns","commit_id":"d209fcd6fc3951f43feb788fd55499546a03142f"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"c4d7fb20e3f5c5826cf0a622566db0c296ab5958","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    table \u003d op.create_table("},{"line_number":45,"context_line":"        \u0027networkrbacs\u0027,"},{"line_number":46,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse,"},{"line_number":47,"context_line":"                  default\u003duuidutils.generate_uuid),"},{"line_number":48,"context_line":"        sa.Column(\u0027object_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":50,"context_line":"        sa.Column(\u0027target_tenant\u0027, sa.String(length\u003d255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_54254906","line":47,"in_reply_to":"fa32b979_09c10654","updated":"2015-06-18 07:55:43.000000000","message":"Yes, server default doesn\u0027t work for UUIDs, sorry, just remove it.","commit_id":"d209fcd6fc3951f43feb788fd55499546a03142f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"18b0433fb48c29d5bd2f61064ce874859c59e0fd","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    table \u003d op.create_table("},{"line_number":45,"context_line":"        \u0027networkrbacs\u0027,"},{"line_number":46,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse,"},{"line_number":47,"context_line":"                  default\u003duuidutils.generate_uuid),"},{"line_number":48,"context_line":"        sa.Column(\u0027object_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":50,"context_line":"        sa.Column(\u0027target_tenant\u0027, sa.String(length\u003d255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_09c10654","line":47,"in_reply_to":"fa32b979_c701db06","updated":"2015-06-17 16:40:21.000000000","message":"server default doesn\u0027t work for UUIDs, which is why i had to manually set the values. I will remove this default column.","commit_id":"d209fcd6fc3951f43feb788fd55499546a03142f"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"06bbb71f983fd05ee290f3a84874e5486967b213","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027))"},{"line_number":56,"context_line":"    op.create_index(op.f(\u0027ix_networkrbacs_tenant_id\u0027),"},{"line_number":57,"context_line":"                    \u0027networkrbacs\u0027, [\u0027tenant_id\u0027], unique\u003dFalse)"},{"line_number":58,"context_line":"    op.create_unique_constraint(name\u003d\u0027uniq_target_object_action\u0027,"},{"line_number":59,"context_line":"                                source\u003d\u0027networkrbacs\u0027,"},{"line_number":60,"context_line":"                                local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027,"},{"line_number":61,"context_line":"                                            \u0027target_tenant\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_e7ce5f2d","line":58,"updated":"2015-06-17 10:51:57.000000000","message":"Uniqueconstraints should be named \"uniq_(table_name)0(column_names)\"","commit_id":"d209fcd6fc3951f43feb788fd55499546a03142f"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"c4d7fb20e3f5c5826cf0a622566db0c296ab5958","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027))"},{"line_number":56,"context_line":"    op.create_index(op.f(\u0027ix_networkrbacs_tenant_id\u0027),"},{"line_number":57,"context_line":"                    \u0027networkrbacs\u0027, [\u0027tenant_id\u0027], unique\u003dFalse)"},{"line_number":58,"context_line":"    op.create_unique_constraint(name\u003d\u0027uniq_target_object_action\u0027,"},{"line_number":59,"context_line":"                                source\u003d\u0027networkrbacs\u0027,"},{"line_number":60,"context_line":"                                local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027,"},{"line_number":61,"context_line":"                                            \u0027target_tenant\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_3458c587","line":58,"in_reply_to":"fa32b979_c9b6bef8","updated":"2015-06-18 07:55:43.000000000","message":"Because it is name conventions for Uniqueconstraints names, and in Neutron they are named so.","commit_id":"d209fcd6fc3951f43feb788fd55499546a03142f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"18b0433fb48c29d5bd2f61064ce874859c59e0fd","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027))"},{"line_number":56,"context_line":"    op.create_index(op.f(\u0027ix_networkrbacs_tenant_id\u0027),"},{"line_number":57,"context_line":"                    \u0027networkrbacs\u0027, [\u0027tenant_id\u0027], unique\u003dFalse)"},{"line_number":58,"context_line":"    op.create_unique_constraint(name\u003d\u0027uniq_target_object_action\u0027,"},{"line_number":59,"context_line":"                                source\u003d\u0027networkrbacs\u0027,"},{"line_number":60,"context_line":"                                local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027,"},{"line_number":61,"context_line":"                                            \u0027target_tenant\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_c9b6bef8","line":58,"in_reply_to":"fa32b979_e7ce5f2d","updated":"2015-06-17 16:40:21.000000000","message":"why? I don\u0027t have a problem changing it, i just want to know the reason.","commit_id":"d209fcd6fc3951f43feb788fd55499546a03142f"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"c4c2e455b291e4a1004d73b52964e18c34e16968","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \u0027networkrbacs\u0027,"},{"line_number":45,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":46,"context_line":"        sa.Column(\u0027object_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":47,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":48,"context_line":"        sa.Column(\u0027target_tenant\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027action\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":50,"context_line":"        sa.ForeignKeyConstraint([\u0027object_id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_0a2611ce","line":47,"updated":"2015-06-23 08:21:25.000000000","message":"Why you are not using index\u003dTrue here? Is there a reason for that?","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f5ebcdca1a6fee75e4dba1ac1c6b5a53f8dcaaca","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \u0027networkrbacs\u0027,"},{"line_number":45,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":46,"context_line":"        sa.Column(\u0027object_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":47,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":48,"context_line":"        sa.Column(\u0027target_tenant\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027action\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":50,"context_line":"        sa.ForeignKeyConstraint([\u0027object_id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba3cc151_08a06b9e","line":47,"in_reply_to":"fa32b979_0a2611ce","updated":"2015-07-07 14:19:42.000000000","message":"Done","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"c4c2e455b291e4a1004d73b52964e18c34e16968","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        sa.ForeignKeyConstraint([\u0027object_id\u0027],"},{"line_number":51,"context_line":"                                [\u0027networks.id\u0027],"},{"line_number":52,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027))"},{"line_number":54,"context_line":"    op.create_index(op.f(\u0027ix_networkrbacs_tenant_id\u0027),"},{"line_number":55,"context_line":"                    \u0027networkrbacs\u0027, [\u0027tenant_id\u0027], unique\u003dFalse)"},{"line_number":56,"context_line":"    op.create_unique_constraint("}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_6d71f7a7","line":53,"updated":"2015-06-23 08:21:25.000000000","message":"And why not to use here \n\n     sa.UniqueConstraint(\u0027action\u0027, \u0027object_id\u0027, \u0027target_tenant\u0027,     \n                          name\u003d\u0027uniq_networkrbacs0tenant_target0object_id0action\u0027)?","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f5ebcdca1a6fee75e4dba1ac1c6b5a53f8dcaaca","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        sa.ForeignKeyConstraint([\u0027object_id\u0027],"},{"line_number":51,"context_line":"                                [\u0027networks.id\u0027],"},{"line_number":52,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027))"},{"line_number":54,"context_line":"    op.create_index(op.f(\u0027ix_networkrbacs_tenant_id\u0027),"},{"line_number":55,"context_line":"                    \u0027networkrbacs\u0027, [\u0027tenant_id\u0027], unique\u003dFalse)"},{"line_number":56,"context_line":"    op.create_unique_constraint("}],"source_content_type":"text/x-python","patch_set":10,"id":"ba3cc151_6891f751","line":53,"in_reply_to":"fa32b979_6d71f7a7","updated":"2015-07-07 14:19:42.000000000","message":"Done","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"868d1f15985e55c3591a89fec20a4140f1055228","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        name\u003d\u0027uniq_networkrbacs0tenant_target0object_id0action\u0027,"},{"line_number":58,"context_line":"        source\u003d\u0027networkrbacs\u0027,"},{"line_number":59,"context_line":"        local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027, \u0027target_tenant\u0027])"},{"line_number":60,"context_line":"    op.bulk_insert(table, get_values())"},{"line_number":61,"context_line":"    op.drop_column(\u0027networks\u0027, \u0027shared\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_7c4820cd","line":60,"updated":"2015-06-19 19:43:32.000000000","message":"This migration is non-additive and should be put on hold until we get plan set for online db migrations as per https://review.openstack.org/192937","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"da10d7b3fa14d3f00d32d5821afaee7ed1b7d5bb","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        name\u003d\u0027uniq_networkrbacs0tenant_target0object_id0action\u0027,"},{"line_number":58,"context_line":"        source\u003d\u0027networkrbacs\u0027,"},{"line_number":59,"context_line":"        local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027, \u0027target_tenant\u0027])"},{"line_number":60,"context_line":"    op.bulk_insert(table, get_values())"},{"line_number":61,"context_line":"    op.drop_column(\u0027networks\u0027, \u0027shared\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba3cc151_2b147442","line":60,"in_reply_to":"ba3cc151_a8dbb41a","updated":"2015-06-30 05:51:42.000000000","message":"Sorry, I am on vacation. I should get to it in a day or two.","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3d7185eb17f788eca6bdb39043caba1bc67e3677","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        name\u003d\u0027uniq_networkrbacs0tenant_target0object_id0action\u0027,"},{"line_number":58,"context_line":"        source\u003d\u0027networkrbacs\u0027,"},{"line_number":59,"context_line":"        local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027, \u0027target_tenant\u0027])"},{"line_number":60,"context_line":"    op.bulk_insert(table, get_values())"},{"line_number":61,"context_line":"    op.drop_column(\u0027networks\u0027, \u0027shared\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba3cc151_a8dbb41a","line":60,"in_reply_to":"ba3cc151_c8c5d85b","updated":"2015-06-29 22:37:45.000000000","message":"It\u0027s in review, and passes all the checks: https://review.openstack.org/#/c/194198/ I think we should somehow make db team to look at the spec and the patch though. I\u0027ve tried to poke Henry several times with no luck.","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"45fb086815db8046d89cd756a2cebcd70e5e0c41","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        name\u003d\u0027uniq_networkrbacs0tenant_target0object_id0action\u0027,"},{"line_number":58,"context_line":"        source\u003d\u0027networkrbacs\u0027,"},{"line_number":59,"context_line":"        local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027, \u0027target_tenant\u0027])"},{"line_number":60,"context_line":"    op.bulk_insert(table, get_values())"},{"line_number":61,"context_line":"    op.drop_column(\u0027networks\u0027, \u0027shared\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_8987c8d6","line":60,"in_reply_to":"fa32b979_5881a1fa","updated":"2015-06-22 07:50:09.000000000","message":"Well, it\u0027s not blocked, I haven\u0027t voted in any way. Just a heads-up that it may be feasible to understand how to proceed in context of the online db discussion.","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"be50a010b0880476aa2ff9d3537b7ecf38290273","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        name\u003d\u0027uniq_networkrbacs0tenant_target0object_id0action\u0027,"},{"line_number":58,"context_line":"        source\u003d\u0027networkrbacs\u0027,"},{"line_number":59,"context_line":"        local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027, \u0027target_tenant\u0027])"},{"line_number":60,"context_line":"    op.bulk_insert(table, get_values())"},{"line_number":61,"context_line":"    op.drop_column(\u0027networks\u0027, \u0027shared\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_5881a1fa","line":60,"in_reply_to":"fa32b979_7c4820cd","updated":"2015-06-19 23:46:07.000000000","message":"Great. I was hoping this work would be blocked by other work just sitting in a spec. :/","commit_id":"e085259387297028cb4972e28e674d7d9208e726"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9f2300079da004ff2a147693d351bc5c4629bd91","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        name\u003d\u0027uniq_networkrbacs0tenant_target0object_id0action\u0027,"},{"line_number":58,"context_line":"        source\u003d\u0027networkrbacs\u0027,"},{"line_number":59,"context_line":"        local_cols\u003d[\u0027action\u0027, \u0027object_id\u0027, \u0027target_tenant\u0027])"},{"line_number":60,"context_line":"    op.bulk_insert(table, get_values())"},{"line_number":61,"context_line":"    op.drop_column(\u0027networks\u0027, \u0027shared\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba3cc151_c8c5d85b","line":60,"in_reply_to":"fa32b979_8987c8d6","updated":"2015-06-29 22:34:22.000000000","message":"How can I move forward with this patch? Did you merge the change in alembic script structure yet?","commit_id":"e085259387297028cb4972e28e674d7d9208e726"}],"neutron/db/models_v2.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"eb11808cf321792e82996f5c6e38ebc37bdeb802","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                    and entry.action \u003d\u003d \u0027access_as_shared\u0027):"},{"line_number":278,"context_line":"                return entry"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    @shared.setter"},{"line_number":281,"context_line":"    def shared(self, shared):"},{"line_number":282,"context_line":"        if shared \u003d\u003d self.shared:"},{"line_number":283,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_1d9ab26e","line":280,"updated":"2015-07-08 13:20:20.000000000","message":"That is very neat. Eventually it will go into Network object implementation, once we get one.","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"dca8b35288bc498c3ddd57de223c985764a8efa8","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                    and entry.action \u003d\u003d \u0027access_as_shared\u0027):"},{"line_number":278,"context_line":"                return entry"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    @shared.setter"},{"line_number":281,"context_line":"    def shared(self, shared):"},{"line_number":282,"context_line":"        if shared \u003d\u003d self.shared:"},{"line_number":283,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_93df9139","line":280,"in_reply_to":"ba3cc151_1d9ab26e","updated":"2015-07-08 13:35:41.000000000","message":"neat but I basically had to toss it in the trash. \u0027shared\u0027 needed to be relative to the API caller, not just restricted to the wildcard.","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"}],"neutron/db/rbac_db.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1da31b7bd1bce3e7d5ad9dfefbd44151604912c7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    object_id \u003d sa.Column(sa.String(36),"},{"line_number":64,"context_line":"                          sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":65,"context_line":"                          nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":66,"context_line":"    object_type \u003d \u0027network\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get_valid_actions(self):"},{"line_number":69,"context_line":"        return (\u0027access_as_shared\u0027,)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_c1ffeaff","line":66,"updated":"2015-06-15 14:59:49.000000000","message":"What\u0027s this? The name of the table is networkrbacs, so surely the object can only be a network?","commit_id":"6ad1a3007816bb050863af0e2c73ea1231ff26e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"393cf05b2849950b874c12e5a62f445a37f2f7fa","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    object_id \u003d sa.Column(sa.String(36),"},{"line_number":64,"context_line":"                          sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":65,"context_line":"                          nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":66,"context_line":"    object_type \u003d \u0027network\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get_valid_actions(self):"},{"line_number":69,"context_line":"        return (\u0027access_as_shared\u0027,)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_f70f3fdf","line":66,"in_reply_to":"fa32b979_c1ffeaff","updated":"2015-06-15 22:19:40.000000000","message":"it\u0027s an identifier that will determine what name is used in the API to manipulate this table. See L39","commit_id":"6ad1a3007816bb050863af0e2c73ea1231ff26e9"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e597a25d24e07303737a2e2f7f187ffaca89a558","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    object_id \u003d sa.Column(sa.String(36),"},{"line_number":64,"context_line":"                          sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":65,"context_line":"                          nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":66,"context_line":"    object_type \u003d \u0027network\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get_valid_actions(self):"},{"line_number":69,"context_line":"        return (\u0027access_as_shared\u0027,)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_fa5ac682","line":66,"in_reply_to":"fa32b979_f70f3fdf","updated":"2015-06-15 23:36:24.000000000","message":"Thanks. I read it too quickly and was bitten by the mixin grue.","commit_id":"6ad1a3007816bb050863af0e2c73ea1231ff26e9"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"5033189d1f00aab6e1c96b1b4e93c6f5a3b63ae6","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    # NOTE(kevinbenton): this can currently  only be a tenant ID or a wildcard."},{"line_number":32,"context_line":"    # If we get keystone integration for role events, we can use roles here as"},{"line_number":33,"context_line":"    # well."},{"line_number":34,"context_line":"    tenant \u003d sa.Column(sa.String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    # this determines the the name that users will use in the API"},{"line_number":37,"context_line":"    # to reference the type. sub-classes should set their own"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_8bc0077e","line":34,"updated":"2015-06-16 02:33:56.000000000","message":"I wonder if we should also use tenant_id here even though it can be * as we use tenant_id everywhere else in the code for the models.","commit_id":"7d3aeb05952d7b6b1d77829bfcb200892125794b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"18bc1c97584f58d84d5970ff2b1b0ddedcb67e66","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    # NOTE(kevinbenton): this can currently  only be a tenant ID or a wildcard."},{"line_number":32,"context_line":"    # If we get keystone integration for role events, we can use roles here as"},{"line_number":33,"context_line":"    # well."},{"line_number":34,"context_line":"    tenant \u003d sa.Column(sa.String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    # this determines the the name that users will use in the API"},{"line_number":37,"context_line":"    # to reference the type. sub-classes should set their own"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_dcdd7715","line":34,"in_reply_to":"fa32b979_8bc0077e","updated":"2015-06-16 05:20:53.000000000","message":"well I wanted to stay away from \u0027tenant_id\u0027 because in the future it could be a role or some other way to represent a tenant beyond the ID.","commit_id":"7d3aeb05952d7b6b1d77829bfcb200892125794b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9dcf38f9a91c9b9721aa3cdde12caa97140d1803","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    # NOTE(kevinbenton): this can currently  only be a tenant ID or a wildcard."},{"line_number":32,"context_line":"    # If we get keystone integration for role events, we can use roles here as"},{"line_number":33,"context_line":"    # well."},{"line_number":34,"context_line":"    tenant \u003d sa.Column(sa.String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    # this determines the the name that users will use in the API"},{"line_number":37,"context_line":"    # to reference the type. sub-classes should set their own"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_fff5a6ca","line":34,"in_reply_to":"fa32b979_dcdd7715","updated":"2015-06-16 19:21:20.000000000","message":"k makes sense.","commit_id":"7d3aeb05952d7b6b1d77829bfcb200892125794b"}],"neutron/db/rbac_db_models.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"eb11808cf321792e82996f5c6e38ebc37bdeb802","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \"\u0027%(object_type)s\u0027. Valid actions: %(valid_actions)s\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RBACColumns(object):"},{"line_number":30,"context_line":"    \"\"\"Mixin that object-specific RBAC tables should inherit."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    All RBAC tables should inherit directly from this one because"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_9d3d62df","line":29,"updated":"2015-07-08 13:20:20.000000000","message":"That\u0027s an interesting approach for inheritance. An alternative would be to link common and specific tables using a foreign key, as we do in feature/qos: http://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/qos/models.py?h\u003dfeature/qos#n73 (note there are issues there, f.e. classes should not inherit one another)","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"116ff148284d2f7e07a67185eb3776f1ae33aaa0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \"\u0027%(object_type)s\u0027. Valid actions: %(valid_actions)s\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RBACColumns(object):"},{"line_number":30,"context_line":"    \"\"\"Mixin that object-specific RBAC tables should inherit."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    All RBAC tables should inherit directly from this one because"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_00832257","line":29,"in_reply_to":"ba3cc151_6e41c662","updated":"2015-07-08 15:06:34.000000000","message":"The rbac table can only have one relationship per column, so if we did it that way we couldn\u0027t add rbac support to other things in the future.","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"dca8b35288bc498c3ddd57de223c985764a8efa8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \"\u0027%(object_type)s\u0027. Valid actions: %(valid_actions)s\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RBACColumns(object):"},{"line_number":30,"context_line":"    \"\"\"Mixin that object-specific RBAC tables should inherit."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    All RBAC tables should inherit directly from this one because"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_d37af987","line":29,"in_reply_to":"ba3cc151_9d3d62df","updated":"2015-07-08 13:35:41.000000000","message":"I can certainly change to a common table with relationship tables. However, I had run into a cascading issue.\n\nSay the networks rbac table has a reference to a network and an rbac entry. When the network is deleted, it\u0027s easy to cascade the deletion to the network rbac table. However, the main record was left in the rbac table (i.e. cascades only flow from parent to child).\n\nI didn\u0027t see a particularly clean way to deal with this at the DB level. Do you have that issue in QoS?","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e206ad9083139879cbee74dcc084bfbf98e215c3","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \"\u0027%(object_type)s\u0027. Valid actions: %(valid_actions)s\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RBACColumns(object):"},{"line_number":30,"context_line":"    \"\"\"Mixin that object-specific RBAC tables should inherit."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    All RBAC tables should inherit directly from this one because"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_6e41c662","line":29,"in_reply_to":"ba3cc151_d37af987","updated":"2015-07-08 13:53:17.000000000","message":"For qos rules, our model is linear: policy \u003c- common-rule \u003c- specific-rule. So cascading should work.\n\nI think in your case, if you would link from network to common rbac table instead of specific one, you would have it cascade properly.\n\nnetwork \u003c- rbac table \u003c- network-rbac table\n\nWould it work?","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"eb11808cf321792e82996f5c6e38ebc37bdeb802","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\"Mixin that object-specific RBAC tables should inherit."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    All RBAC tables should inherit directly from this one because"},{"line_number":33,"context_line":"    the RBAC code uses the __subclasses__() method to disover the"},{"line_number":34,"context_line":"    RBAC types."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    # we can\u0027t inherit HasId or tenatn_id because they are in models_v2"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_7da89e8c","line":33,"updated":"2015-07-08 13:20:20.000000000","message":"discover","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"eb11808cf321792e82996f5c6e38ebc37bdeb802","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    the RBAC code uses the __subclasses__() method to disover the"},{"line_number":34,"context_line":"    RBAC types."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    # we can\u0027t inherit HasId or tenatn_id because they are in models_v2"},{"line_number":37,"context_line":"    # which imports this module"},{"line_number":38,"context_line":"    id \u003d sa.Column(sa.String(36), primary_key\u003dTrue,"},{"line_number":39,"context_line":"                   default\u003duuidutils.generate_uuid)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_5d7b5a28","line":36,"updated":"2015-07-08 13:20:20.000000000","message":"tenant_id","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"eb11808cf321792e82996f5c6e38ebc37bdeb802","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    # neutron gets better integration with keystone"},{"line_number":47,"context_line":"    target_tenant \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    action \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # this determines the the name that users will use in the API"},{"line_number":52,"context_line":"    # to reference the type. sub-classes should set their own"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_bd1386b7","line":49,"updated":"2015-07-08 13:20:20.000000000","message":"Should we have the list of possible values enforced somehow? Will enum apply here? If that\u0027s concern about actions not being common to all submodels, then it can be a good idea to move it from here into submodels.","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"dca8b35288bc498c3ddd57de223c985764a8efa8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    # neutron gets better integration with keystone"},{"line_number":47,"context_line":"    target_tenant \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    action \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # this determines the the name that users will use in the API"},{"line_number":52,"context_line":"    # to reference the type. sub-classes should set their own"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_d3ef591c","line":49,"in_reply_to":"ba3cc151_bd1386b7","updated":"2015-07-08 13:35:41.000000000","message":"this is enforced by get_valid_actions that each sub-model defines.","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"eb11808cf321792e82996f5c6e38ebc37bdeb802","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    action \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # this determines the the name that users will use in the API"},{"line_number":52,"context_line":"    # to reference the type. sub-classes should set their own"},{"line_number":53,"context_line":"    object_type \u003d \u0027NOTIMPLEMENTED\u0027"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_dd7f6ade","line":51,"updated":"2015-07-08 13:20:20.000000000","message":"the the -\u003e the","commit_id":"e1d8209da25b908fa35de4d5eb8c8f9b6093c26d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \"\u0027%(object_type)s\u0027. Valid actions: %(valid_actions)s\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RBACColumns(models_v2.HasId, models_v2.HasTenant):"},{"line_number":30,"context_line":"    \"\"\"Mixin that object-specific RBAC tables should inherit."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    All RBAC tables should inherit directly from this one because"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_85c60648","line":29,"updated":"2015-07-16 14:44:04.000000000","message":"curious: why do we need tenant_id here if it\u0027s linked to an object with tenant_id field?\n\nYou could also claim the class as ABC.","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8a4d90412dba78f5690810462a9e7d13499df7ed","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \"\u0027%(object_type)s\u0027. Valid actions: %(valid_actions)s\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RBACColumns(models_v2.HasId, models_v2.HasTenant):"},{"line_number":30,"context_line":"    \"\"\"Mixin that object-specific RBAC tables should inherit."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    All RBAC tables should inherit directly from this one because"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_13b3050c","line":29,"in_reply_to":"9a41bdd9_85c60648","updated":"2015-07-17 07:04:05.000000000","message":"The owner of the rbac entry could be different then the object owner (e.g. admin creates the RBAC entry for a user-owned network).","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # this determines the name that users will use in the API"},{"line_number":45,"context_line":"    # to reference the type. sub-classes should set their own"},{"line_number":46,"context_line":"    object_type \u003d \u0027NOTIMPLEMENTED\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    __table_args__ \u003d ("},{"line_number":49,"context_line":"        sa.UniqueConstraint(\u0027target_tenant\u0027, \u0027object_id\u0027, \u0027action\u0027),"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_05f2f66f","line":46,"updated":"2015-07-16 14:44:04.000000000","message":"You could then make it an abstractmethod property to enforce reimplementation.","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8a4d90412dba78f5690810462a9e7d13499df7ed","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # this determines the name that users will use in the API"},{"line_number":45,"context_line":"    # to reference the type. sub-classes should set their own"},{"line_number":46,"context_line":"    object_type \u003d \u0027NOTIMPLEMENTED\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    __table_args__ \u003d ("},{"line_number":49,"context_line":"        sa.UniqueConstraint(\u0027target_tenant\u0027, \u0027object_id\u0027, \u0027action\u0027),"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_d519f823","line":46,"in_reply_to":"9a41bdd9_05f2f66f","updated":"2015-07-17 07:04:05.000000000","message":"Done","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        model_base.BASEV2.__table_args__"},{"line_number":51,"context_line":"    )"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @validates(\u0027action\u0027)"},{"line_number":54,"context_line":"    def _validate_action(self, key, action):"},{"line_number":55,"context_line":"        if action not in self.get_valid_actions():"},{"line_number":56,"context_line":"            raise InvalidActionForType("}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_852126b7","line":53,"updated":"2015-07-16 14:44:04.000000000","message":"Cool.","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    object_type \u003d \u0027network\u0027"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def get_valid_actions(self):"},{"line_number":80,"context_line":"        return (\u0027access_as_shared\u0027,)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_05675626","line":80,"updated":"2015-07-16 14:44:04.000000000","message":"Since that is used in multiple places in the code, I believe it would be better to move it to some common place that will start collecting actions.","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8a4d90412dba78f5690810462a9e7d13499df7ed","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    object_type \u003d \u0027network\u0027"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def get_valid_actions(self):"},{"line_number":80,"context_line":"        return (\u0027access_as_shared\u0027,)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_b5d79422","line":80,"in_reply_to":"9a41bdd9_05675626","updated":"2015-07-17 07:04:05.000000000","message":"But this call needs to be different per object type.","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"}],"neutron/tests/api/admin/test_shared_network_extension.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2dfd92da057f7540dd10d7a798d771ac0fa12c34","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        self.assertNotEmpty(items)"},{"line_number":52,"context_line":"        self.assertTrue(all(n[\u0027shared\u0027] \u003d\u003d shared for n in items))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @test.idempotent_id(\u00276661d219-b96d-4597-ad10-51672353421a\u0027)"},{"line_number":55,"context_line":"    def test_filtering_shared_subnets(self):"},{"line_number":56,"context_line":"        # shared subnets need to be tested because their shared status isn\u0027t"},{"line_number":57,"context_line":"        # visible as a regular API attribute and it\u0027s solely dependent on the"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_e8e7a744","line":54,"updated":"2015-07-16 14:44:04.000000000","message":"should those be identical?","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8a4d90412dba78f5690810462a9e7d13499df7ed","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        self.assertNotEmpty(items)"},{"line_number":52,"context_line":"        self.assertTrue(all(n[\u0027shared\u0027] \u003d\u003d shared for n in items))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @test.idempotent_id(\u00276661d219-b96d-4597-ad10-51672353421a\u0027)"},{"line_number":55,"context_line":"    def test_filtering_shared_subnets(self):"},{"line_number":56,"context_line":"        # shared subnets need to be tested because their shared status isn\u0027t"},{"line_number":57,"context_line":"        # visible as a regular API attribute and it\u0027s solely dependent on the"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a41bdd9_55d088c9","line":54,"in_reply_to":"9a41bdd9_e8e7a744","updated":"2015-07-17 07:04:05.000000000","message":"they aren\u0027t. check the numbers right after ad10 :)","commit_id":"6ed25346aa55809b086931424ba8036948cdb87c"}]}
