)]}'
{"neutron/db/migration/alembic_migrations/versions/mitaka/expand/5abc0278ca73_add_support_for_vlan_trunking.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"a6c07a1162be39b2f2227163f66609b7fcf2242b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    ### commands auto generated by Alembic - please adjust! ###"},{"line_number":34,"context_line":"    op.create_table(\u0027trunks\u0027,"},{"line_number":35,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_f806ddcc","line":35,"range":{"start_line":35,"start_character":19,"end_line":35,"end_character":28},"updated":"2016-02-12 08:15:56.000000000","message":"add index\u003dTrue instead of creating index separately.","commit_id":"0b0f62ace3322a41a4a60aa6a7945dd886f6dde4"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"a6c07a1162be39b2f2227163f66609b7fcf2242b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":41,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":42,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027),"},{"line_number":43,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027"},{"line_number":44,"context_line":"    )"},{"line_number":45,"context_line":"    op.create_index(op.f(\u0027ix_trunks_tenant_id\u0027), \u0027trunks\u0027, [\u0027tenant_id\u0027],"},{"line_number":46,"context_line":"                    unique\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_d85a01f2","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":29},"updated":"2016-02-12 08:15:56.000000000","message":"Not needed, remove this","commit_id":"0b0f62ace3322a41a4a60aa6a7945dd886f6dde4"},{"author":{"_account_id":6681,"name":"Brent Eagles","email":"beagles@redhat.com","username":"beagles"},"change_message_id":"d7d339a7796899fd907c6d680c00e11211ce4abf","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":41,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":42,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027),"},{"line_number":43,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027"},{"line_number":44,"context_line":"    )"},{"line_number":45,"context_line":"    op.create_index(op.f(\u0027ix_trunks_tenant_id\u0027), \u0027trunks\u0027, [\u0027tenant_id\u0027],"},{"line_number":46,"context_line":"                    unique\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_ad5017d5","line":43,"in_reply_to":"3a57f1b5_d85a01f2","updated":"2016-02-12 13:48:37.000000000","message":"Thanks for both - should take the comment \"### commands auto generated by Alembic - please adjust! ### \" a little more seriously I guess!","commit_id":"0b0f62ace3322a41a4a60aa6a7945dd886f6dde4"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7102a7e215080fa36cfeaf4b9aecbe571492aaf6","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    ### commands auto generated by Alembic - please adjust! ###"},{"line_number":34,"context_line":"    op.create_table(\u0027trunks\u0027,"},{"line_number":35,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue,"},{"line_number":36,"context_line":"                  index\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a54edaf_f22f76f4","line":33,"updated":"2016-02-13 09:05:13.000000000","message":"let\u0027s remove this comment.","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d0f049e36e006a6a97001d57d321c6d970867d99","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027)"},{"line_number":44,"context_line":"    )"},{"line_number":45,"context_line":"    op.create_table(\u0027subports\u0027,"},{"line_number":46,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":47,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":48,"context_line":"        sa.Column(\u0027trunk_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027segmentation_type\u0027, sa.String(length\u003d32), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_3b9cbb68","line":46,"range":{"start_line":46,"start_character":24,"end_line":46,"end_character":44},"updated":"2016-02-16 15:52:06.000000000","message":"Do we need this id to be a uuid? This will not be exposed in the API. Or maybe it is simpler to have a uuid because of model_base.HasId?","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d0f049e36e006a6a97001d57d321c6d970867d99","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":52,"context_line":"        sa.ForeignKeyConstraint([\u0027trunk_id\u0027], [\u0027trunks.id\u0027],"},{"line_number":53,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":54,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027port_id\u0027, \u0027trunk_id\u0027),"},{"line_number":55,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027),"},{"line_number":56,"context_line":"        sa.UniqueConstraint(\u0027trunk_id\u0027, \u0027segmentation_type\u0027, \u0027segmentation_id\u0027,"},{"line_number":57,"context_line":"            name\u003d\u0027uniq_subport0trunk_id0segmentation_type0segmentation_id\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_695799ce","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":61},"updated":"2016-02-16 15:52:06.000000000","message":"I\u0027m not sure if we need all three here. Do we lose anything if we have PrimaryKeyConstraint(\u0027id\u0027) only?\n\nOr not have an id column at all and have PrimaryKeyConstraint(\u0027port_id\u0027, \u0027trunk_id\u0027)?","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7102a7e215080fa36cfeaf4b9aecbe571492aaf6","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        sa.UniqueConstraint(\u0027trunk_id\u0027, \u0027segmentation_type\u0027, \u0027segmentation_id\u0027,"},{"line_number":57,"context_line":"            name\u003d\u0027uniq_subport0trunk_id0segmentation_type0segmentation_id\u0027)"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":"    ### end Alembic commands ###"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a54edaf_9234024b","line":59,"updated":"2016-02-13 09:05:13.000000000","message":"ditto","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"57872cbfd4dc6cf96f83c967bf49244aa6428c6e","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027trunks\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue,"},{"line_number":35,"context_line":"                  index\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_89865d63","line":34,"range":{"start_line":34,"start_character":19,"end_line":34,"end_character":28},"updated":"2016-02-16 15:37:19.000000000","message":"Is the tenant_id ever different from the port\u0027s tenant_id?","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b86eccbf6967fa4737a55d110bfed3fedd7458ce","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027trunks\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue,"},{"line_number":35,"context_line":"                  index\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_b9b7eed6","line":34,"range":{"start_line":34,"start_character":19,"end_line":34,"end_character":28},"in_reply_to":"dae33548_89865d63","updated":"2016-02-17 16:23:05.000000000","message":"Could be if admin wants to create a trunk port with subports belonging to networks of different tenants. For example a network middlebox in a VM serving lots of tenants.","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"57872cbfd4dc6cf96f83c967bf49244aa6428c6e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    op.create_table(\u0027trunks\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue,"},{"line_number":35,"context_line":"                  index\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_69c0397c","line":36,"range":{"start_line":36,"start_character":19,"end_line":36,"end_character":21},"updated":"2016-02-16 15:37:19.000000000","message":"Seems to me you could skip this field and just use the port_id as the primary key?","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b86eccbf6967fa4737a55d110bfed3fedd7458ce","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    op.create_table(\u0027trunks\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue,"},{"line_number":35,"context_line":"                  index\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_79d9e621","line":36,"range":{"start_line":36,"start_character":19,"end_line":36,"end_character":21},"in_reply_to":"dae33548_69c0397c","updated":"2016-02-17 16:23:05.000000000","message":"We\u0027ll have a new trunk resource, it must have its own uuid.","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"57872cbfd4dc6cf96f83c967bf49244aa6428c6e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027)"},{"line_number":43,"context_line":"    )"},{"line_number":44,"context_line":"    op.create_table(\u0027subports\u0027,"},{"line_number":45,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":46,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":47,"context_line":"        sa.Column(\u0027trunk_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":48,"context_line":"        sa.Column(\u0027segmentation_type\u0027, sa.String(length\u003d32), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_e910c903","line":45,"range":{"start_line":45,"start_character":19,"end_line":45,"end_character":21},"updated":"2016-02-16 15:37:19.000000000","message":"Skip this field and use port_id as the primary key?","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"57872cbfd4dc6cf96f83c967bf49244aa6428c6e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":51,"context_line":"        sa.ForeignKeyConstraint([\u0027trunk_id\u0027], [\u0027trunks.id\u0027],"},{"line_number":52,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027port_id\u0027, \u0027trunk_id\u0027),"},{"line_number":54,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027),"},{"line_number":55,"context_line":"        sa.UniqueConstraint(\u0027trunk_id\u0027, \u0027segmentation_type\u0027, \u0027segmentation_id\u0027,"},{"line_number":56,"context_line":"            name\u003d\u0027uniq_subport0trunk_id0segmentation_type0segmentation_id\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_2922b152","line":53,"range":{"start_line":53,"start_character":11,"end_line":53,"end_character":60},"updated":"2016-02-16 15:37:19.000000000","message":"Seems unnecessary.","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"57872cbfd4dc6cf96f83c967bf49244aa6428c6e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027port_id\u0027, \u0027trunk_id\u0027),"},{"line_number":54,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027),"},{"line_number":55,"context_line":"        sa.UniqueConstraint(\u0027trunk_id\u0027, \u0027segmentation_type\u0027, \u0027segmentation_id\u0027,"},{"line_number":56,"context_line":"            name\u003d\u0027uniq_subport0trunk_id0segmentation_type0segmentation_id\u0027)"},{"line_number":57,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_e9b569ee","line":56,"range":{"start_line":55,"start_character":11,"end_line":56,"end_character":75},"updated":"2016-02-16 15:37:19.000000000","message":"Seems unnecessary.","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b86eccbf6967fa4737a55d110bfed3fedd7458ce","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027port_id\u0027, \u0027trunk_id\u0027),"},{"line_number":54,"context_line":"        sa.UniqueConstraint(\u0027port_id\u0027),"},{"line_number":55,"context_line":"        sa.UniqueConstraint(\u0027trunk_id\u0027, \u0027segmentation_type\u0027, \u0027segmentation_id\u0027,"},{"line_number":56,"context_line":"            name\u003d\u0027uniq_subport0trunk_id0segmentation_type0segmentation_id\u0027)"},{"line_number":57,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_cc0b0e23","line":56,"range":{"start_line":55,"start_character":11,"end_line":56,"end_character":75},"in_reply_to":"dae33548_e9b569ee","updated":"2016-02-17 16:23:05.000000000","message":"We must have this constraint, otherwise one could create two subports, which are on different networks, but look the same from inside a VM (where all the user sees is a vNIC, segmentation type and id). Then we can\u0027t tell on which network the frame should be forwarded.","commit_id":"a1b543577b3e299aa6bc6edb5e37252082d78a44"}],"neutron/db/migration/alembic_migrations/versions/newton/expand/5abc0278ca73_add_support_for_vlan_trunking.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"15cd1f2f0a13cbc11e860e4d42a61a08782c339e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"\"\"\"add support for vlan trunking"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Revision ID: 5abc0278ca73"},{"line_number":17,"context_line":"Revises: b4caf27aae4"},{"line_number":18,"context_line":"Create Date: 2016-02-09 16:35:17.288935"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_6653f7e2","line":17,"range":{"start_line":17,"start_character":9,"end_line":17,"end_character":20},"updated":"2016-04-20 03:53:32.000000000","message":"nit:  This is stale.  I often just take these out because the info is duplicated in the code and its just extra noise here.","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8cde3555e01c4b4c489b2edf78739bd4e495716d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"\"\"\"add support for vlan trunking"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Revision ID: 5abc0278ca73"},{"line_number":17,"context_line":"Revises: b4caf27aae4"},{"line_number":18,"context_line":"Create Date: 2016-02-09 16:35:17.288935"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_2376ed6f","line":17,"range":{"start_line":17,"start_character":9,"end_line":17,"end_character":20},"in_reply_to":"1a122d0e_6653f7e2","updated":"2016-04-20 14:58:27.000000000","message":"oopsie","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":21284,"name":"Pavel Gluschak (scsnow)","email":"pglushchak@virtuozzo.com","username":"scsnow"},"change_message_id":"eebca3674e88116ecfee1c2a68d81f7996bbafc5","unresolved":false,"context_lines":[{"line_number":24,"context_line":"                  index\u003dTrue),"},{"line_number":25,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":27,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger(), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":29,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":30,"context_line":"        sa.ForeignKeyConstraint([\u0027standard_attr_id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_260b96d7","line":27,"updated":"2016-04-20 16:20:06.000000000","message":"What does it for? I\u0027m asking because it\u0027s not listed in spec: http://specs.openstack.org/openstack/neutron-specs/specs/mitaka/vlan-aware-vms.html","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1d28013597bccc0d87831cc604a9bc9ceb49d00b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"                  index\u003dTrue),"},{"line_number":25,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":27,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger(), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":29,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":30,"context_line":"        sa.ForeignKeyConstraint([\u0027standard_attr_id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_26d9d657","line":27,"in_reply_to":"1a122d0e_260b96d7","updated":"2016-04-20 16:21:25.000000000","message":"http://docs.openstack.org/developer/neutron/devref/db_layer.html#the-standard-attribute-table","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"}],"neutron/db/trunk_ports/models.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7102a7e215080fa36cfeaf4b9aecbe571492aaf6","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Trunk(model_base.BASEV2, model_base.HasId, model_base.HasTenant):"},{"line_number":25,"context_line":"    __tablename__ \u003d \u0027trunks\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":28,"context_line":"    # as primary keys most of the time..."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a54edaf_d2111ab1","line":25,"updated":"2016-02-13 09:05:13.000000000","message":"This is not required. plz remove.","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d0f049e36e006a6a97001d57d321c6d970867d99","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class Trunk(model_base.BASEV2, model_base.HasId, model_base.HasTenant):"},{"line_number":25,"context_line":"    __tablename__ \u003d \u0027trunks\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":28,"context_line":"    # as primary keys most of the time..."},{"line_number":29,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":30,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_49aa9571","line":28,"range":{"start_line":27,"start_character":0,"end_line":28,"end_character":41},"updated":"2016-02-16 15:52:06.000000000","message":"Somebody suggested using integer primary keys because you can join on integer keys faster. I personally do not know if this is a good db schema design practice or premature optimization.","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7102a7e215080fa36cfeaf4b9aecbe571492aaf6","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class SubPort(model_base.BASEV2, model_base.HasId):"},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027subports\u0027"},{"line_number":43,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":44,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":45,"context_line":"                                      ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a54edaf_920ba27d","line":42,"updated":"2016-02-13 09:05:13.000000000","message":"This is not required. plz remove.","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d0f049e36e006a6a97001d57d321c6d970867d99","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                        primary_key\u003dTrue)"},{"line_number":49,"context_line":"    port \u003d sa.orm.relationship("},{"line_number":50,"context_line":"        models_v2.Port,"},{"line_number":51,"context_line":"        backref\u003dsa.orm.backref(\u0027sub_port\u0027, lazy\u003d\u0027joined\u0027, uselist\u003dFalse,"},{"line_number":52,"context_line":"                               cascade\u003d\u0027delete\u0027))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    trunk_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_894e5d94","line":51,"range":{"start_line":51,"start_character":32,"end_line":51,"end_character":40},"updated":"2016-02-16 15:52:06.000000000","message":"Shall we spell it \u0027subport\u0027 everywhere?","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d0f049e36e006a6a97001d57d321c6d970867d99","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        model_base.BASEV2.__table_args__"},{"line_number":70,"context_line":"    )"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(beagles): How do you implement a constraint that a port cannot be a"},{"line_number":73,"context_line":"# subport and a trunk port at the same time - efficiently that is?"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_0479942f","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":66},"updated":"2016-02-16 15:52:06.000000000","message":"I think this is worse, because we would have to have a constraint that trunk and subports are free of loops. But I think we can just live without this constraint.","commit_id":"338b548946e996448efab475603c22b1104c6097"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"18088bcddd68e0687543e355124ef80f34756700","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.db import models_v2"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Trunk(model_base.BASEV2, model_base.HasId, model_base.HasTenant):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_68599e8e","line":24,"updated":"2016-02-25 04:03:22.000000000","message":"are we allowing for other users to create trunks on behalf of other users? I don\u0027t seem to recall this from the spec. Is the tenant field necessary at this stage?","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"83eec28eb6aefccd227cb63cff959e4422a00cd4","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.db import models_v2"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Trunk(model_base.BASEV2, model_base.HasId, model_base.HasTenant):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_f8c6f914","line":24,"in_reply_to":"bae84128_68599e8e","updated":"2016-02-25 15:36:03.000000000","message":"I see that the tenant_id is in the proposed model, but the part on admin operations is a big vague. It definitely won\u0027t hurt if left like this.","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"e66baa5e76c517c0bcc91ab4bc52151991da1d02","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Trunk(model_base.BASEV2, model_base.HasId, model_base.HasTenant):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":29,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aed3d3a_37bb7e74","line":27,"range":{"start_line":26,"start_character":4,"end_line":27,"end_character":40},"updated":"2016-02-25 22:22:40.000000000","message":"I believe the spec must be updated to reflect this. It should not be an integer.","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"ac3f0a8cdbaabc3a2829cd5a3e73508c57b5d55e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Trunk(model_base.BASEV2, model_base.HasId, model_base.HasTenant):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":29,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aed3d3a_d2d02056","line":27,"range":{"start_line":26,"start_character":4,"end_line":27,"end_character":40},"in_reply_to":"9aed3d3a_0ca0b142","updated":"2016-02-26 19:20:41.000000000","message":"Ok.. I see what you are saying. Makes sense. For Brent\u0027s reference.. this[1] is what Armando is talking about... hope it helps answer your question.\n\n[1]: https://review.openstack.org/#/c/222079/","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"37ff436f1287bb5a65f86b5a6c0af39251eb0207","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Trunk(model_base.BASEV2, model_base.HasId, model_base.HasTenant):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":29,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aed3d3a_0ca0b142","line":27,"range":{"start_line":26,"start_character":4,"end_line":27,"end_character":40},"in_reply_to":"9aed3d3a_37bb7e74","updated":"2016-02-26 18:50:47.000000000","message":"actually, this should probably follow the pattern for other resources like ports, networks etc. If we want things like tags, timestamps etc..the integer id allows to join the trunk table with the standardattr table. So no, the spec is in sync with the code, but we have a the missing foreign key constraint","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"6b94cb3dcbd08025e16403d7418b4cdaf7f36842","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":29,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":31,"context_line":"                                      ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_6499a91f","line":28,"updated":"2016-02-25 15:32:24.000000000","message":"Do we need this field? IMO it will just be confusing to name the trunk port differently from the port being used. Most likely the user will create the port with the intent of using it as a trunk and name it \"MyTrunk1\".","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0eef8885e5112097a29745184109a93029379637","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":29,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":31,"context_line":"                                      ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_1ea8e5da","line":28,"in_reply_to":"bae84128_1870fddb","updated":"2016-02-25 15:56:18.000000000","message":"Makes sense.","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"e66baa5e76c517c0bcc91ab4bc52151991da1d02","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":29,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":31,"context_line":"                                      ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aed3d3a_d74972d2","line":28,"in_reply_to":"bae84128_1ea8e5da","updated":"2016-02-25 22:22:40.000000000","message":"I think I agree with Henry\u0027s previous comment about the confusion of names. Name can be updated whenever the port is made a trunk port. Having a single name field sounds better IMO","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"242b38e612914ac164335bb1801f47a6ded9c1e1","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # why does the spec have an integer for the id? We seem to use uuid\u0027s"},{"line_number":27,"context_line":"    # as primary keys most of the time..."},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(attrs.NAME_MAX_LEN))"},{"line_number":29,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":31,"context_line":"                                      ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_1870fddb","line":28,"in_reply_to":"bae84128_6499a91f","updated":"2016-02-25 15:37:39.000000000","message":"A port can be made a trunk port at any point in its life cycle. The name in this table won\u0027t hurt (just like tenant_id).\n\nAt this point I wonder whether it\u0027s wiser to leave these in, rather than having the need to deal with a migration (to add them) later on.","commit_id":"6545e427e0858e9f23384b8ec68e4624f7769b7e"}],"neutron/services/trunk/db.py":[{"author":{"_account_id":11907,"name":"cathy","email":"cathy.h.zhang@huawei.com","username":"cathy"},"change_message_id":"9ed2e71095243310b921076fffc161512a3a61b6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                    port_id\u003dport_id,"},{"line_number":33,"context_line":"                    description\u003ddescription))"},{"line_number":34,"context_line":"    except db_exc.DBDuplicateEntry:"},{"line_number":35,"context_line":"        raise exceptions.TrunkPortInUse(port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_a93da5c5","line":35,"range":{"start_line":35,"start_character":39,"end_line":35,"end_character":40},"updated":"2016-04-20 23:16:31.000000000","message":"I do not see db resource for subport. Is it in another patch?","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"54ca7835dd2e5efe1f1d8de7899c2b2264955c2c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                    port_id\u003dport_id,"},{"line_number":33,"context_line":"                    description\u003ddescription))"},{"line_number":34,"context_line":"    except db_exc.DBDuplicateEntry:"},{"line_number":35,"context_line":"        raise exceptions.TrunkPortInUse(port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_297cf5ea","line":35,"range":{"start_line":35,"start_character":39,"end_line":35,"end_character":40},"in_reply_to":"1a122d0e_a93da5c5","updated":"2016-04-20 23:35:05.000000000","message":"yes, I\u0027ll take care of those in a follow-up.","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"5897b51c13da8aa87a8b7c324184870ab787918c","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.services.trunk import models"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def create_trunk(context, port_id, description\u003dNone):"},{"line_number":25,"context_line":"    \"\"\"Create a trunk (with description) given the parent port uuid.\"\"\""},{"line_number":26,"context_line":"    try:"},{"line_number":27,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_b48f3a22","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":16},"updated":"2016-04-24 23:25:36.000000000","message":"Would there be other functions (e.g. {remove/modify}_{subport,trunk})?\n\nQ: The location of db.py/models.py seems to be different from other plugins/services (i.e. neutron.db.*, sans neutron.services.auto_allocate). While I do like the idea to have features/services fully packaged into their specific modules, it feels inconsistent. Is it a new style for newly created services (is there some guideline/spec for it)?","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"156d7afdfa47f7084211f1b2d5e19faa7e76612f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.services.trunk import models"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def create_trunk(context, port_id, description\u003dNone):"},{"line_number":25,"context_line":"    \"\"\"Create a trunk (with description) given the parent port uuid.\"\"\""},{"line_number":26,"context_line":"    try:"},{"line_number":27,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_c8821a00","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":16},"in_reply_to":"1a122d0e_b48f3a22","updated":"2016-04-25 02:42:53.000000000","message":"I personally favor cohesiveness, which means that things that relates to each other should belong together and not scattered throughout the module structure, especially when the neutron/db module is growing substantially. I appreciate that this might feel different from other efforts, but we don\u0027t have a written rule, and I don\u0027t believe we should have one.","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"156d7afdfa47f7084211f1b2d5e19faa7e76612f","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def create_trunk(context, port_id, description\u003dNone):"},{"line_number":25,"context_line":"    \"\"\"Create a trunk (with description) given the parent port uuid.\"\"\""},{"line_number":26,"context_line":"    try:"},{"line_number":27,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":28,"context_line":"            context.session.add("}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_688b061f","line":25,"updated":"2016-04-25 02:42:53.000000000","message":"as for your question: yes, there will be more. I just want to take full credit of what I do and not wanting to taint Brent\u0027s original patch any further.","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"}],"neutron/services/trunk/exceptions.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d3c1cb466a5933231d9b07b3cd1f2ebb5fff0c7d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from neutron._i18n import _"},{"line_number":18,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TrunkPortInUse(n_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_70da29eb","line":18,"updated":"2016-04-21 15:13:22.000000000","message":"plz import from neutron_lib","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fc6a61a7a92465062c6bab7910cde2fb64d6f293","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from neutron._i18n import _"},{"line_number":18,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TrunkPortInUse(n_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_a55120db","line":18,"in_reply_to":"1a122d0e_70da29eb","updated":"2016-04-21 16:06:34.000000000","message":"Done","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"}],"neutron/services/trunk/models.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"15cd1f2f0a13cbc11e860e4d42a61a08782c339e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                         nullable\u003dFalse,"},{"line_number":53,"context_line":"                         primary_key\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dFalse)"},{"line_number":56,"context_line":"    segmentation_id \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_a6efcf85","line":55,"updated":"2016-04-20 03:53:32.000000000","message":"These are the segmentation type and id used locally to the VM.  For example, if this were vlan and 1000 then the guest VM would create a vlan interface like eth0.1000 to communicate through the port.\n\nCan a trunk port support multiple segmentation types across all of its various subports at the same time?  What would that even look like in the guest VM?  Are we going to support more than just vlan segmentation type for subports?  I\u0027ve only even dealt with vlan tags at the OS level.\n\nThe blueprint only talks about vlan.  I\u0027m not sure what other types might be useful.  I wonder if we should consider doing one of these:\n\n - moving segmentation_type to the trunk model if it needs to be consistent across all of the subports throughout the trunk.\n - leaving it off entirely and assume vlan until a use case comes up for another type of segmentation.  Just a thought to punt the decision of where to place segmentation_type to the future when someone might actually use other types.\n\nJust a thought.","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1e00df2cf6c5d5094913b15cebd2e413a9c61ff2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                         nullable\u003dFalse,"},{"line_number":53,"context_line":"                         primary_key\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dFalse)"},{"line_number":56,"context_line":"    segmentation_id \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_e6fd1eb2","line":55,"in_reply_to":"1a122d0e_830edce2","updated":"2016-04-20 16:20:32.000000000","message":"I think that more importantly than the logical schema, these considerations of yours apply to the API model too, where segmentation type is a property of the sub-port resource. All I can tell at this stage is that this is a result of many, many iterations spanning multiple cycles. The model can be simplified or made more sophisticated, but this one seems to have hit the sweet spot.","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8cde3555e01c4b4c489b2edf78739bd4e495716d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                         nullable\u003dFalse,"},{"line_number":53,"context_line":"                         primary_key\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dFalse)"},{"line_number":56,"context_line":"    segmentation_id \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_e359958f","line":55,"in_reply_to":"1a122d0e_a6efcf85","updated":"2016-04-20 14:58:27.000000000","message":"you\u0027re right that at this pace we might only ever see *vlan* support consistently applied to *all* sub-ports of the trunk, but this might be true for the implementation we\u0027re after on top of ovs. That said, this is the most flexible model we could think of to accommodate any possible combination of usage that might be allowed by other implementations.","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"cc9c2993ba699a2d5362c3d4af061fbb2b2c9e9a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                         nullable\u003dFalse,"},{"line_number":53,"context_line":"                         primary_key\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dFalse)"},{"line_number":56,"context_line":"    segmentation_id \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_830edce2","line":55,"in_reply_to":"1a122d0e_e359958f","updated":"2016-04-20 16:01:09.000000000","message":"This is fine.  I tend to shy away from creating \"the most flexible model ... to accommodate any possible combination\"  Sometimes its more pain up front than its worth.  But, actually, I suggested just taking it out of both models because that leaves flexibility for the future, without making the decision about where it really should go up front.  You know, punt the design down the road because we don\u0027t need it now.  The only gotcha is that if someone ever does want to support something besides vlan, they\u0027ll have to add a field with a migration in order to allow it.  So, I\u0027m fine with it in here.\n\nIf it were up to me, I would say that mixing segmentation type on a VM port is ridiculous and no one will ever want it.  So, I\u0027d leave it out.  I also tend to think that no one will ever want anything besides vlan because I think the chances of needing to connect a VM to more that 4000 networks are pretty tiny and the work-arounds are pretty reasonable.  But, these are just my opinions.","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"9ca734bbf9ee2e7bae3b4459fe2c03f656f6ea35","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                         nullable\u003dFalse,"},{"line_number":53,"context_line":"                         primary_key\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dFalse)"},{"line_number":56,"context_line":"    segmentation_id \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_f5f6595b","line":55,"in_reply_to":"1a122d0e_e6fd1eb2","updated":"2016-04-20 20:16:37.000000000","message":"Question: in regards to the need to connect a VM to more than 4000 networks, is there anything stopping the VM from having multiple trunk ports, with each trunk having 4000+ subports?","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"19144870569a8f607472f26e1c99ab2a7630f926","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                         nullable\u003dFalse,"},{"line_number":53,"context_line":"                         primary_key\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dFalse)"},{"line_number":56,"context_line":"    segmentation_id \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_f80ac9d0","line":55,"in_reply_to":"1a122d0e_f5f6595b","updated":"2016-04-20 22:04:35.000000000","message":"If the parent ports were to be connected to the same network, that might work and this model allows that, but we\u0027ll have to see in practice how the data plane implementation turns out to be like.","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"15cd1f2f0a13cbc11e860e4d42a61a08782c339e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        model_base.BASEV2.__table_args__"},{"line_number":65,"context_line":"    )"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# NOTE(armax): constraints like:"},{"line_number":68,"context_line":"#"},{"line_number":69,"context_line":"# Deletion of a trunk automatically deletes all of its subports,"},{"line_number":70,"context_line":"# Deletion of a (child) port referred by a subport is forbidden,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_c6e92bb9","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":31},"updated":"2016-04-20 03:53:32.000000000","message":"piconit, I had trouble parsing this the first time.  This might help:\n\n# NOTE(armax) constraints like the following are implemented via business logic rules:","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8cde3555e01c4b4c489b2edf78739bd4e495716d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        model_base.BASEV2.__table_args__"},{"line_number":65,"context_line":"    )"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# NOTE(armax): constraints like:"},{"line_number":68,"context_line":"#"},{"line_number":69,"context_line":"# Deletion of a trunk automatically deletes all of its subports,"},{"line_number":70,"context_line":"# Deletion of a (child) port referred by a subport is forbidden,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_03f811c2","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":31},"in_reply_to":"1a122d0e_c6e92bb9","updated":"2016-04-20 14:58:27.000000000","message":"Done","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"3c0a9b6cb1c80650a789fe784677e2cca7068581","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Red Hat Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_a285a05a","line":1,"updated":"2016-04-21 13:28:58.000000000","message":"if you have to respin for some reason...the copyright has the wrong company name :)","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fc6a61a7a92465062c6bab7910cde2fb64d6f293","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Red Hat Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_a547604a","line":1,"in_reply_to":"1a122d0e_a285a05a","updated":"2016-04-21 16:06:34.000000000","message":"Why? This was written by Brent, not me.","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"82067360ee1e02a7678e64f045df9a643b1a7f38","unresolved":false,"context_lines":[{"line_number":71,"context_line":"# Deletion of a (child) port referred by a subport is forbidden,"},{"line_number":72,"context_line":"# Deletion of a (parent) port referred by a trunk is forbidden,"},{"line_number":73,"context_line":"# A port cannot be a subport and a trunk port at the same time (nested),"},{"line_number":74,"context_line":"# are implemented via business logic rules."}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_35d9f157","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":43},"updated":"2016-04-20 20:15:54.000000000","message":"nit: this could be removed if you have to re-spin another patchset.","commit_id":"d5e32bbadba0e11d3bafe45f6bb61f08bb8b0ea3"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"5897b51c13da8aa87a8b7c324184870ab787918c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class Trunk(model_base.HasStandardAttributes, model_base.BASEV2,"},{"line_number":23,"context_line":"            model_base.HasId, model_base.HasTenant):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":26,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":27,"context_line":"                                      ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":28,"context_line":"                        nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_34cfaa80","line":25,"range":{"start_line":25,"start_character":4,"end_line":25,"end_character":11},"updated":"2016-04-24 23:25:36.000000000","message":"nit:Is it really necessary for a Trunk to have different \u0027id\u0027 and \u0027port_id\u0027? Can\u0027t we reuse \u0027port_id\u0027 here as primary key? That way we could also get trunk Port from SubPort with a single join.","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"156d7afdfa47f7084211f1b2d5e19faa7e76612f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class Trunk(model_base.HasStandardAttributes, model_base.BASEV2,"},{"line_number":23,"context_line":"            model_base.HasId, model_base.HasTenant):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    port_id \u003d sa.Column(sa.String(36),"},{"line_number":26,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":27,"context_line":"                                      ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":28,"context_line":"                        nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_087d321c","line":25,"range":{"start_line":25,"start_character":4,"end_line":25,"end_character":11},"in_reply_to":"1a122d0e_34cfaa80","updated":"2016-04-25 02:42:53.000000000","message":"Yes, it is. They are two different resources.","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"5897b51c13da8aa87a8b7c324184870ab787918c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"# business logic rules:"},{"line_number":69,"context_line":"#"},{"line_number":70,"context_line":"# Deletion of a trunk automatically deletes all of its subports,"},{"line_number":71,"context_line":"# Deletion of a (child) port referred by a subport is forbidden,"},{"line_number":72,"context_line":"# Deletion of a (parent) port referred by a trunk is forbidden,"},{"line_number":73,"context_line":"# A port cannot be a subport and a trunk port at the same time (nested),"},{"line_number":74,"context_line":"# are implemented via business logic rules."}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_34968a4c","line":72,"range":{"start_line":71,"start_character":0,"end_line":72,"end_character":62},"updated":"2016-04-24 23:25:36.000000000","message":"why use ondelete\u003d\u0027CASCADE\u0027 and not \u0027RESTRICT\u0027 then?","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"156d7afdfa47f7084211f1b2d5e19faa7e76612f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"# business logic rules:"},{"line_number":69,"context_line":"#"},{"line_number":70,"context_line":"# Deletion of a trunk automatically deletes all of its subports,"},{"line_number":71,"context_line":"# Deletion of a (child) port referred by a subport is forbidden,"},{"line_number":72,"context_line":"# Deletion of a (parent) port referred by a trunk is forbidden,"},{"line_number":73,"context_line":"# A port cannot be a subport and a trunk port at the same time (nested),"},{"line_number":74,"context_line":"# are implemented via business logic rules."}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_6892e64c","line":72,"range":{"start_line":71,"start_character":0,"end_line":72,"end_character":62},"in_reply_to":"1a122d0e_34968a4c","updated":"2016-04-25 02:42:53.000000000","message":"You can use the DBMS integrity constraint, but this may have side effects, such as uncaught integrity violation errors triggered during port delete operations. It\u0027s best to keep existing logic unaffected and introduce a business rule (which might be even changed in the future).","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"5897b51c13da8aa87a8b7c324184870ab787918c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"# Deletion of a (child) port referred by a subport is forbidden,"},{"line_number":72,"context_line":"# Deletion of a (parent) port referred by a trunk is forbidden,"},{"line_number":73,"context_line":"# A port cannot be a subport and a trunk port at the same time (nested),"},{"line_number":74,"context_line":"# are implemented via business logic rules."}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_b4a1faab","line":74,"range":{"start_line":74,"start_character":2,"end_line":74,"end_character":42},"updated":"2016-04-24 23:25:36.000000000","message":"nit: duplicate from NOTE(armax) line","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"156d7afdfa47f7084211f1b2d5e19faa7e76612f","unresolved":false,"context_lines":[{"line_number":71,"context_line":"# Deletion of a (child) port referred by a subport is forbidden,"},{"line_number":72,"context_line":"# Deletion of a (parent) port referred by a trunk is forbidden,"},{"line_number":73,"context_line":"# A port cannot be a subport and a trunk port at the same time (nested),"},{"line_number":74,"context_line":"# are implemented via business logic rules."}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_28a90e7c","line":74,"range":{"start_line":74,"start_character":2,"end_line":74,"end_character":42},"in_reply_to":"1a122d0e_b4a1faab","updated":"2016-04-25 02:42:53.000000000","message":"Done","commit_id":"025f8f169c05f035d2067d3203fe22f072ef1411"}],"neutron/tests/unit/services/trunk/test_db.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"15cd1f2f0a13cbc11e860e4d42a61a08782c339e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":28,"context_line":"        self.setup()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def setup(self):"},{"line_number":31,"context_line":"        with self.ctx.session.begin(subtransactions\u003dTrue):"},{"line_number":32,"context_line":"            self.ctx.session.add(models_v2.Network(id\u003d\u0027foo_net\u0027))"},{"line_number":33,"context_line":"            port \u003d models_v2.Port(id\u003d\u0027foo_port\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_e632675d","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":13},"updated":"2016-04-20 03:53:32.000000000","message":"This seems strange and hardly worth it.  Two methods named the same with only a small capitalization difference.  One calls the other.\n\nIs this second setup method meant to be called from some other context too?  Or, is there some other reason for it that escaped my notice?","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8cde3555e01c4b4c489b2edf78739bd4e495716d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":28,"context_line":"        self.setup()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def setup(self):"},{"line_number":31,"context_line":"        with self.ctx.session.begin(subtransactions\u003dTrue):"},{"line_number":32,"context_line":"            self.ctx.session.add(models_v2.Network(id\u003d\u0027foo_net\u0027))"},{"line_number":33,"context_line":"            port \u003d models_v2.Port(id\u003d\u0027foo_port\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_03e65114","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":13},"in_reply_to":"1a122d0e_e632675d","updated":"2016-04-20 14:58:27.000000000","message":"in reality, I think I am gonna turn this into something different.","commit_id":"c4bb96d70b9db0851443d6c13ccfd996c0888a99"}]}
