)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":9,"context_line":"* Implements a vendor neutral database model centered around a QoS"},{"line_number":10,"context_line":"object."},{"line_number":11,"context_line":"\t* QoS objects have a type"},{"line_number":12,"context_line":"\t\t* Type is an Enum, with two current choices: \"DSCP\" for"},{"line_number":13,"context_line":"\t\tmarking packets with a DSCP mark, and \"ratelimit\" which will"},{"line_number":14,"context_line":"\t\tthrottle a port or all ports attached to a network based on a bandwidth value"},{"line_number":15,"context_line":"\t* QoS objects have policy key-value pairs for implementation specific behaviors"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"AAAATn%2F%2ByWw%3D","line":12,"updated":"2013-11-20 07:56:27.000000000","message":"nit: dcsp ?","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"}],"neutron/db/migration/alembic_migrations/versions/562fa8b1d4b5_qos.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"from neutron.db import migration"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def upgrade(active_plugin\u003dNone, options\u003dNone):"},{"line_number":44,"context_line":"    if not migration.should_run(active_plugin, migration_for_plugins):"},{"line_number":45,"context_line":"        return"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYFE%3D","line":43,"updated":"2013-09-05 14:25:14.000000000","message":"this should be active_plugins as we now supporting service plugins as well","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":"        return"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    if \u0027qoss\u0027 in sa.MetaData().tables:"},{"line_number":48,"context_line":"        op.rename_table(\u0027qoss\u0027, \u0027cisco_qoss\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    op.create_table("},{"line_number":51,"context_line":"        \u0027qoss\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FXII%3D","line":48,"updated":"2013-09-05 17:47:30.000000000","message":"Not needed. It has been renamed and is now called \u0027cisco_qos_policies\u0027.","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"    op.drop_table(\u0027networkqosmappings\u0027)"},{"line_number":88,"context_line":"    op.drop_table(\u0027qoss\u0027)"},{"line_number":89,"context_line":"    if \u0027qoss\u0027 in sa.MetaData().tables:"},{"line_number":90,"context_line":"        op.rename_table(\u0027cisco_qoss\u0027, \u0027qoss\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FXHU%3D","line":90,"updated":"2013-09-05 17:47:30.000000000","message":"Not needed.","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\"Add QoS db models"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Revision ID: 562fa8b1d4b5"},{"line_number":21,"context_line":"Revises: 4a666eb208c2"},{"line_number":22,"context_line":"Create Date: 2013-04-22 10:53:29.669259"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2to%3D","line":21,"updated":"2013-09-18 08:10:39.000000000","message":"please sync with down_revision at #28","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    op.create_table("},{"line_number":48,"context_line":"        \u0027qoses\u0027,"},{"line_number":49,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":50,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":51,"context_line":"        sa.Column(\u0027type\u0027, sa.Enum(\u0027dscp\u0027, \u0027ratelimit\u0027)),"},{"line_number":52,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003d255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAS3%2F%2Fti0%3D","line":49,"updated":"2013-09-20 19:25:31.000000000","message":"String length\u003d255 for tenant_id.\nSee neutron.db.models_v2.HasTenant","commit_id":"93bb1d9b7f05dc030e5f4e67511c8bebe09375fa"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    op.create_table("},{"line_number":48,"context_line":"        \u0027qoses\u0027,"},{"line_number":49,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":50,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":51,"context_line":"        sa.Column(\u0027type\u0027, sa.Enum(\u0027dscp\u0027, \u0027ratelimit\u0027)),"},{"line_number":52,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003d255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAS3%2F%2FsVU%3D","line":49,"in_reply_to":"AAAAS3%2F%2Fti0%3D","updated":"2013-09-21 13:58:59.000000000","message":"thanks","commit_id":"93bb1d9b7f05dc030e5f4e67511c8bebe09375fa"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from alembic import op"},{"line_number":37,"context_line":"import sqlalchemy as sa"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"from neutron.db import migration"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BxgY%3D","line":38,"updated":"2013-11-20 12:06:27.000000000","message":"nit: one empty line should be removed","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":60,"context_line":"        sa.Column(\u0027key\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":61,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":62,"context_line":"        sa.ForeignKeyConstraint([\u0027qos_id\u0027], [\u0027qoses.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":63,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027qos_id\u0027, \u0027key\u0027),"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Bbak%3D","line":63,"updated":"2013-11-26 08:11:29.000000000","message":"I think primarykey is just id, and qos_id and key should be an unique constraint.","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"unresolved":false,"context_lines":[{"line_number":50,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), primary_key\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027type\u0027, sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":52,"context_line":"                                  constants.TYPE_QOS_RATELIMIT,"},{"line_number":53,"context_line":"                                  name\u003d\u0027qos_types\u0027)),"},{"line_number":54,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":55,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":56,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BhHY%3D","line":53,"updated":"2014-03-26 08:46:03.000000000","message":"Please, take a look at this change https://review.openstack.org/53112 and organize work with Enum as it is done in my change then you will avoid problems with downgrade in PostgreSQL.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"}],"neutron/db/qos_db.py":[{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":60,"context_line":"            context.session.delete(item)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _db_query_single(self, context, dbtype, id):"},{"line_number":63,"context_line":"        return self._model_query(context, dbtype).filter(dbtype.id \u003d\u003d id).one()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def create_qos(self, context, qos):"},{"line_number":66,"context_line":"        if self.validate_qos(qos):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2Folg%3D","line":63,"updated":"2013-07-26 04:57:02.000000000","message":".one() may raise an sqlalchemy exceprion. it should be transrated to a quantum exception so that proper HTTP response is returned to an API caller. otherwise 500 is returned to the caller.","commit_id":"4b93e9d065cf69bb27006905371aa43a225bfcb6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":"    network \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027networks.id\u0027,"},{"line_number":36,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":37,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027qoss.id\u0027,"},{"line_number":38,"context_line":"                    ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class PortQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYAM%3D","line":38,"updated":"2013-09-05 14:25:14.000000000","message":"should this be primary key, IOW can one network be associated with several qoses?","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    network \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027networks.id\u0027,"},{"line_number":36,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":37,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027qoss.id\u0027,"},{"line_number":38,"context_line":"                    ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class PortQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FXP8%3D","line":38,"in_reply_to":"AAAASn%2F%2FYAM%3D","updated":"2013-09-05 17:22:41.000000000","message":"If I make some logic to make sure that you can have only one of each policy type, I can see that as a possibility. I\u0027d probably want to make a separate table for the policy types - so I can use FK\u0027s and composite primary keys to enforce. \n\nIE - you could have a network with two QoS\u0027s - one that marks with a DSCP - and one that does rate limiting.\n\nSince this BP is going for Icehouse - I think that would work.","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":"    port \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":43,"context_line":"                     ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027qoss.id\u0027,"},{"line_number":45,"context_line":"                    ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class QoSDbMixin(ext_qos.QoSPluginBase):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYAE%3D","line":45,"updated":"2013-09-05 14:25:14.000000000","message":"ditto","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"    type \u003d sa.Column(sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":31,"context_line":"                             constants.TYPE_QOS_RATELIMIT))"},{"line_number":32,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":33,"context_line":"    policy \u003d orm.relationship(\u0027QoSPolicies\u0027,"},{"line_number":34,"context_line":"                              cascade\u003d\u0027all, delete, delete-orphan\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2sI%3D","line":33,"updated":"2013-09-18 08:10:39.000000000","message":"consider \u0027policies\u0027","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":34,"context_line":"                              cascade\u003d\u0027all, delete, delete-orphan\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class QoSPolicies(model_base.BASEV2, models_v2.HasId):"},{"line_number":38,"context_line":"    __tablename__ \u003d \u0027qos_policies\u0027"},{"line_number":39,"context_line":"    qos \u003d sa.Column(sa.String(36),"},{"line_number":40,"context_line":"                    sa.ForeignKey(\u0027qoses.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2s4%3D","line":37,"updated":"2013-09-18 08:10:39.000000000","message":"why plural?","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"},{"line_number":47,"context_line":"    network \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027networks.id\u0027,"},{"line_number":48,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":49,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027qoses.id\u0027,"},{"line_number":50,"context_line":"                    ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2qs%3D","line":47,"updated":"2013-09-18 08:10:39.000000000","message":"nit: consider network_id for more clarity","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class PortQoSMapping(model_base.BASEV2):"},{"line_number":54,"context_line":"    port \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":55,"context_line":"                     ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":56,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027qoses.id\u0027,"},{"line_number":57,"context_line":"                    ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2qo%3D","line":54,"updated":"2013-09-18 08:10:39.000000000","message":"consider port_id","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":73,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":74,"context_line":"            context.session.delete(item)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _db_query_single(self, context, dbtype, id):"},{"line_number":77,"context_line":"        return self._model_query(context, dbtype).filter(dbtype.id \u003d\u003d id).one()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def create_qos(self, context, qos):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2l0%3D","line":76,"updated":"2013-09-18 08:10:39.000000000","message":"seems it duplicates _get_by_id() from CommonDbMixin.","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return self._model_query(context, dbtype).filter(dbtype.id \u003d\u003d id).one()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def create_qos(self, context, qos):"},{"line_number":80,"context_line":"        if self.validate_qos(qos):"},{"line_number":81,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":82,"context_line":"                qos_db_item \u003d QoS(type\u003dqos[\u0027qos\u0027][\u0027type\u0027],"},{"line_number":83,"context_line":"                                  description\u003dqos[\u0027qos\u0027][\u0027description\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2p4%3D","line":80,"updated":"2013-09-18 08:10:39.000000000","message":"consider raising exception inside validate method so no if-else here.","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"        self._db_delete(context,"},{"line_number":108,"context_line":"                        self._model_query(context,"},{"line_number":109,"context_line":"                                          NetworkQoSMapping)"},{"line_number":110,"context_line":"                        .filter(NetworkQoSMapping.network \u003d\u003d network_id).one())"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def delete_qos_for_port(self, context, port_id):"},{"line_number":113,"context_line":"        self._db_delete(context,"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2p0%3D","line":110,"updated":"2013-09-18 08:10:39.000000000","message":"can use filter_by(network\u003dnetwork_id)","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":112,"context_line":"    def delete_qos_for_port(self, context, port_id):"},{"line_number":113,"context_line":"        self._db_delete(context,"},{"line_number":114,"context_line":"                        self._model_query(context, PortQoSMapping)"},{"line_number":115,"context_line":"                        .filter(PortQoSMapping.port \u003d\u003d port_id).one())"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def get_mapping_for_network(self, context, network_id):"},{"line_number":118,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2pw%3D","line":115,"updated":"2013-09-18 08:10:39.000000000","message":"filter_by","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def get_mapping_for_network(self, context, network_id):"},{"line_number":118,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":119,"context_line":"            return self._model_query(context, NetworkQoSMapping).filter("},{"line_number":120,"context_line":"                NetworkQoSMapping.network \u003d\u003d network_id).all()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_mapping_for_port(self, context, port_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2pc%3D","line":119,"updated":"2013-09-18 08:10:39.000000000","message":"ditto","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":120,"context_line":"                NetworkQoSMapping.network \u003d\u003d network_id).all()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_mapping_for_port(self, context, port_id):"},{"line_number":123,"context_line":"        return self._model_query(context, PortQoSMapping).filter("},{"line_number":124,"context_line":"            PortQoSMapping.port \u003d\u003d port_id).all()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def get_qos(self, context, id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2pU%3D","line":123,"updated":"2013-09-18 08:10:39.000000000","message":"ditto","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self._db_delete(context,"},{"line_number":105,"context_line":"                        self._model_query(context,"},{"line_number":106,"context_line":"                                          NetworkQoSMapping)"},{"line_number":107,"context_line":"                        .filter_by(network_id\u003dnetwork_id).one())"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def delete_qos_for_port(self, context, port_id):"},{"line_number":110,"context_line":"        self._db_delete(context,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAS3%2F%2FzmI%3D","line":107,"updated":"2013-09-18 22:08:48.000000000","message":"orm.exc.NoResultFound exception should be catched and transtated a Neutron exception if neccessary.","commit_id":"93bb1d9b7f05dc030e5f4e67511c8bebe09375fa"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def delete_qos_for_port(self, context, port_id):"},{"line_number":110,"context_line":"        self._db_delete(context,"},{"line_number":111,"context_line":"                        self._model_query(context, PortQoSMapping)"},{"line_number":112,"context_line":"                        .filter_by(port_id\u003dport_id).one())"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def get_mapping_for_network(self, context, network_id):"},{"line_number":115,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAS3%2F%2FzmA%3D","line":112,"updated":"2013-09-18 22:08:48.000000000","message":"ditto","commit_id":"93bb1d9b7f05dc030e5f4e67511c8bebe09375fa"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":44,"context_line":"    __tablename__ \u003d \u0027qoses\u0027"},{"line_number":45,"context_line":"    type \u003d sa.Column(sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":46,"context_line":"                             constants.TYPE_QOS_RATELIMIT, name\u003d\u0027qos_types\u0027))"},{"line_number":47,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":"    policies \u003d orm.relationship(\u0027QoSPolicy\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAS3%2F%2FReU%3D","line":45,"updated":"2013-10-01 04:53:34.000000000","message":"I am not sure I understand why \u0027type\u0027 is part of QoS definition and not of QoSPolicy definition. Can you please explain?","commit_id":"0b1671682fc9c447aad55ed4b5606d7932ca5942"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":44,"context_line":"    __tablename__ \u003d \u0027qoses\u0027"},{"line_number":45,"context_line":"    type \u003d sa.Column(sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":46,"context_line":"                             constants.TYPE_QOS_RATELIMIT, name\u003d\u0027qos_types\u0027))"},{"line_number":47,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":"    policies \u003d orm.relationship(\u0027QoSPolicy\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAS3%2F%2FMdw%3D","line":45,"in_reply_to":"AAAAS3%2F%2FReU%3D","updated":"2013-10-02 15:20:56.000000000","message":"Mostly because I get SQLAlchemy to enforce the constraint rather than having to program my own logic to check that the types are valid constants, for free.","commit_id":"0b1671682fc9c447aad55ed4b5606d7932ca5942"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":44,"context_line":"    __tablename__ \u003d \u0027qoses\u0027"},{"line_number":45,"context_line":"    type \u003d sa.Column(sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":46,"context_line":"                             constants.TYPE_QOS_RATELIMIT, name\u003d\u0027qos_types\u0027))"},{"line_number":47,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":"    policies \u003d orm.relationship(\u0027QoSPolicy\u0027,"},{"line_number":49,"context_line":"                                cascade\u003d\u0027all, delete, delete-orphan\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAS3%2F%2FRec%3D","line":46,"updated":"2013-10-01 04:53:34.000000000","message":"Once there will be more type values, it will be required to update this code in addition to constants. My suggestion is to avoid this. Possible solution is to define the enum in the constants, so there will be one place to update.","commit_id":"0b1671682fc9c447aad55ed4b5606d7932ca5942"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":43,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":44,"context_line":"    __tablename__ \u003d \u0027qoses\u0027"},{"line_number":45,"context_line":"    type \u003d sa.Column(sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":46,"context_line":"                             constants.TYPE_QOS_RATELIMIT, name\u003d\u0027qos_types\u0027))"},{"line_number":47,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":"    policies \u003d orm.relationship(\u0027QoSPolicy\u0027,"},{"line_number":49,"context_line":"                                cascade\u003d\u0027all, delete, delete-orphan\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAS3%2F%2FMbs%3D","line":46,"in_reply_to":"AAAAS3%2F%2FRec%3D","updated":"2013-10-02 15:22:35.000000000","message":"Good idea.\n\nI\u0027ll make an array containing the TYPE_QOS_* stuff, and pass it directly in.","commit_id":"0b1671682fc9c447aad55ed4b5606d7932ca5942"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import models_v2"},{"line_number":23,"context_line":"from neutron.extensions import qos as ext_qos"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import sqlalchemy as sa"},{"line_number":26,"context_line":"from sqlalchemy import orm"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BxgM%3D","line":25,"updated":"2013-11-20 12:06:27.000000000","message":"third party import section should go before neutron section","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class QoSPortMappingNotFound(exceptions.NotFound):"},{"line_number":34,"context_line":"    message \u003d _(\"QoS mapping for port %(port_id)s\""},{"line_number":35,"context_line":"                \"and QoS %(qos_id)s could not be found\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BxgI%3D","line":34,"updated":"2013-11-20 12:06:27.000000000","message":"need a space at the end of line","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class QoSNetworkMappingNotFound(exceptions.NotFound):"},{"line_number":39,"context_line":"    message \u003d _(\"QoS mapping for network %(net_id)s\""},{"line_number":40,"context_line":"                \"and QoS %(qos_id)s could not be found\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Bxfs%3D","line":39,"updated":"2013-11-20 12:06:27.000000000","message":"ditto","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":44,"context_line":"    __tablename__ \u003d \u0027qoses\u0027"},{"line_number":45,"context_line":"    type \u003d sa.Column(sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":46,"context_line":"                             constants.TYPE_QOS_RATELIMIT, name\u003d\u0027qos_types\u0027))"},{"line_number":47,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":"    policies \u003d orm.relationship(\u0027QoSPolicy\u0027,"},{"line_number":49,"context_line":"                                cascade\u003d\u0027all, delete, delete-orphan\u0027)"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Bxe0%3D","line":47,"updated":"2013-11-20 12:06:27.000000000","message":"should this really be nullable\u003dFalse?","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":"                       nullable\u003dFalse,"},{"line_number":57,"context_line":"                       primary_key\u003dTrue)"},{"line_number":58,"context_line":"    key \u003d sa.Column(sa.String(255), nullable\u003dFalse,"},{"line_number":59,"context_line":"                    primary_key\u003dTrue)"},{"line_number":60,"context_line":"    value \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BbaQ%3D","line":59,"updated":"2013-11-26 08:11:29.000000000","message":"I think the qos_id and key should be an unique constraint, not part of primary key.","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":101,"context_line":"                              tenant_id\u003dtenant_id)"},{"line_number":102,"context_line":"            for k, v in qos[\u0027qos\u0027][\u0027policies\u0027].iteritems():"},{"line_number":103,"context_line":"                qos_db_item.policies.append("},{"line_number":104,"context_line":"                    QoSPolicy(qos_id\u003dqos_db_item, key\u003dk, value\u003dv))"},{"line_number":105,"context_line":"            context.session.add(qos_db_item)"},{"line_number":106,"context_line":"        return self._create_qos_dict(qos_db_item)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BxeY%3D","line":104,"updated":"2013-11-20 12:06:27.000000000","message":"qos_id\u003dqos_db_item.id?","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":128,"context_line":"            self._db_delete(context,"},{"line_number":129,"context_line":"                            self._model_query(context,"},{"line_number":130,"context_line":"                                              NetworkQoSMapping)"},{"line_number":131,"context_line":"                            .filter_by(network_id\u003dnetwork_id).one())"},{"line_number":132,"context_line":"        except orm.exc.NoResultFound:"},{"line_number":133,"context_line":"            raise exceptions.NotFound"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BbYw%3D","line":131,"updated":"2013-11-26 08:11:29.000000000","message":"so we don\u0027t allow the DSCP and RATELIMIT qos applied on one network or one port at the same time?","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            self._db_delete(context,"},{"line_number":129,"context_line":"                            self._model_query(context,"},{"line_number":130,"context_line":"                                              NetworkQoSMapping)"},{"line_number":131,"context_line":"                            .filter_by(network_id\u003dnetwork_id).one())"},{"line_number":132,"context_line":"        except orm.exc.NoResultFound:"},{"line_number":133,"context_line":"            raise exceptions.NotFound"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BApQ%3D","line":131,"in_reply_to":"AAAATn%2F%2BbYw%3D","updated":"2013-12-03 14:37:40.000000000","message":"Currently, no - that is not supported.","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            self._db_delete(context,"},{"line_number":138,"context_line":"                            self._model_query(context, PortQoSMapping)"},{"line_number":139,"context_line":"                            .filter_by(port_id\u003dport_id).one())"},{"line_number":140,"context_line":"        except orm.exc.NoResultFound:"},{"line_number":141,"context_line":"            raise exceptions.PortNotFound"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BbYs%3D","line":139,"updated":"2013-11-26 08:11:29.000000000","message":"same as above","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":138,"context_line":"                            self._model_query(context, PortQoSMapping)"},{"line_number":139,"context_line":"                            .filter_by(port_id\u003dport_id).one())"},{"line_number":140,"context_line":"        except orm.exc.NoResultFound:"},{"line_number":141,"context_line":"            raise exceptions.PortNotFound"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_mapping_for_network(self, context, network_id):"},{"line_number":144,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Bxd0%3D","line":141,"updated":"2013-11-20 12:06:27.000000000","message":"why PortNotFound if actually looking for a mapping?","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                            self._model_query(context, PortQoSMapping)"},{"line_number":139,"context_line":"                            .filter_by(port_id\u003dport_id).one())"},{"line_number":140,"context_line":"        except orm.exc.NoResultFound:"},{"line_number":141,"context_line":"            raise exceptions.PortNotFound"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_mapping_for_network(self, context, network_id):"},{"line_number":144,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BAoE%3D","line":141,"in_reply_to":"AAAATn%2F%2Bxd0%3D","updated":"2013-12-03 14:40:47.000000000","message":"Mistake on my part - will fix.","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":144,"context_line":"        try:"},{"line_number":145,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":146,"context_line":"                return self._model_query(context, NetworkQoSMapping).filter_by("},{"line_number":147,"context_line":"                    network_id\u003dnetwork_id).all()"},{"line_number":148,"context_line":"        except orm.exc.NotFound:"},{"line_number":149,"context_line":"            raise QoSNetworkMappingNotFound()"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Byaw%3D","line":147,"updated":"2013-11-20 07:30:39.000000000","message":"maybe worth to consider using .one() instead of .all() for this query?","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"        try:"},{"line_number":153,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":154,"context_line":"                return self._model_query(context, PortQoSMapping).filter_by("},{"line_number":155,"context_line":"                    port_id\u003dport_id).all()"},{"line_number":156,"context_line":"        except orm.exc.NotFound:"},{"line_number":157,"context_line":"            raise QoSPortMappingNotFound()"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Byas%3D","line":155,"updated":"2013-11-20 07:30:39.000000000","message":"same comment as for get_mapping_for _network","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":207,"context_line":"            raise Exception(_(\u0027No validator found for type: %s\u0027) % qos[\u0027type\u0027])"},{"line_number":208,"context_line":"        validator(qos[\u0027policies\u0027])"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def validate_policy_dscp(self, policy):"},{"line_number":211,"context_line":"        if constants.TYPE_QOS_DSCP in policy:"},{"line_number":212,"context_line":"            try:"},{"line_number":213,"context_line":"                dscp \u003d int(policy[constants.TYPE_QOS_DSCP])"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BbYc%3D","line":210,"updated":"2013-11-26 08:11:29.000000000","message":"where is validate_policy_qos?","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":207,"context_line":"            raise Exception(_(\u0027No validator found for type: %s\u0027) % qos[\u0027type\u0027])"},{"line_number":208,"context_line":"        validator(qos[\u0027policies\u0027])"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def validate_policy_dscp(self, policy):"},{"line_number":211,"context_line":"        if constants.TYPE_QOS_DSCP in policy:"},{"line_number":212,"context_line":"            try:"},{"line_number":213,"context_line":"                dscp \u003d int(policy[constants.TYPE_QOS_DSCP])"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BApg%3D","line":210,"in_reply_to":"AAAATn%2F%2BbYc%3D","updated":"2013-12-03 14:37:40.000000000","message":"Not sure I understand your question. All validations go to validate_qos, which then does a dynamic call to validate_policy_\u003ctype\u003e","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":191,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":192,"context_line":"            db.update(mapping)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def update_qos(self, context, id, qos):"},{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAUH%2F%2FO%2Bs%3D","line":194,"updated":"2014-01-16 03:56:17.000000000","message":"It seems no way to change \u0027description\u0027.","commit_id":"e19cd118f1438d85bd1b6fa438637a1cfa678586"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":192,"context_line":"            db.update(mapping)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def update_qos(self, context, id, qos):"},{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAUH%2F%2BXOA%3D","line":194,"in_reply_to":"AAAAUH%2F%2FO%2Bs%3D","updated":"2014-01-27 17:59:55.000000000","message":"Done","commit_id":"e19cd118f1438d85bd1b6fa438637a1cfa678586"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"            db.update(mapping)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def update_qos(self, context, id, qos):"},{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":198,"context_line":"            db.policy \u003d []"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAUH%2F%2FO%2B0%3D","line":195,"updated":"2014-01-16 03:56:17.000000000","message":"There are changed attribtes only on the body of PUT normaly.\nvalidate_qos may fail since \u0027type\u0027 may not be included.","commit_id":"e19cd118f1438d85bd1b6fa438637a1cfa678586"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            db.update(mapping)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def update_qos(self, context, id, qos):"},{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":198,"context_line":"            db.policy \u003d []"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAUH%2F%2BXN4%3D","line":195,"in_reply_to":"AAAAUH%2F%2FO%2B0%3D","updated":"2014-01-27 17:59:55.000000000","message":"Will create a unit test to check this and updating the description","commit_id":"e19cd118f1438d85bd1b6fa438637a1cfa678586"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":198,"context_line":"            db.policy \u003d []"},{"line_number":199,"context_line":"            for k, v in qos[\u0027qos\u0027][\u0027policies\u0027].iteritems():"},{"line_number":200,"context_line":"                db.policies.append("},{"line_number":201,"context_line":"                    QoSPolicy(qos_id\u003ddb, key\u003dk, value\u003dv))"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAUH%2F%2FO%2FQ%3D","line":198,"updated":"2014-01-16 03:56:17.000000000","message":"db.policies \u003d []","commit_id":"e19cd118f1438d85bd1b6fa438637a1cfa678586"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":198,"context_line":"            db.policy \u003d []"},{"line_number":199,"context_line":"            for k, v in qos[\u0027qos\u0027][\u0027policies\u0027].iteritems():"},{"line_number":200,"context_line":"                db.policies.append("},{"line_number":201,"context_line":"                    QoSPolicy(qos_id\u003ddb, key\u003dk, value\u003dv))"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAUH%2F%2BXO0%3D","line":198,"in_reply_to":"AAAAUH%2F%2FO%2FQ%3D","updated":"2014-01-27 17:59:55.000000000","message":"Done","commit_id":"e19cd118f1438d85bd1b6fa438637a1cfa678586"},{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"                \"and QoS %(qos_id)s could not be found\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":44,"context_line":"    __tablename__ \u003d \u0027qoses\u0027"},{"line_number":45,"context_line":"    type \u003d sa.Column(sa.Enum(constants.TYPE_QOS_DSCP,"},{"line_number":46,"context_line":"                             constants.TYPE_QOS_RATELIMIT, name\u003d\u0027qos_types\u0027))"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAUX%2F%2BrKA%3D","line":43,"updated":"2014-02-19 21:21:50.000000000","message":"Need docstrings for all methods.","commit_id":"46bba000f857777fab548747fa480e23eaf99b2e"},{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"unresolved":false,"context_lines":[{"line_number":103,"context_line":"            qos_db_item \u003d QoS(type\u003dqos[\u0027qos\u0027][\u0027type\u0027],"},{"line_number":104,"context_line":"                              description\u003dqos[\u0027qos\u0027][\u0027description\u0027],"},{"line_number":105,"context_line":"                              tenant_id\u003dtenant_id)"},{"line_number":106,"context_line":"            for k, v in qos[\u0027qos\u0027][\u0027policies\u0027].iteritems():"},{"line_number":107,"context_line":"                qos_db_item.policies.append("},{"line_number":108,"context_line":"                    QoSPolicy(qos_id\u003dqos_db_item.id, key\u003dk, value\u003dv))"},{"line_number":109,"context_line":"            context.session.add(qos_db_item)"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAUX%2F%2BrNQ%3D","line":106,"updated":"2014-02-19 21:21:50.000000000","message":"use .items() for python 3 compatibility.","commit_id":"46bba000f857777fab548747fa480e23eaf99b2e"},{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"unresolved":false,"context_lines":[{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":198,"context_line":"            db.policies \u003d []"},{"line_number":199,"context_line":"            for k, v in qos[\u0027qos\u0027][\u0027policies\u0027].iteritems():"},{"line_number":200,"context_line":"                db.policies.append("},{"line_number":201,"context_line":"                    QoSPolicy(qos_id\u003ddb, key\u003dk, value\u003dv))"},{"line_number":202,"context_line":"            del qos[\u0027qos\u0027][\u0027policies\u0027]"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAUX%2F%2BrM8%3D","line":199,"updated":"2014-02-19 21:21:50.000000000","message":"use .items() for python 3 compatibility","commit_id":"46bba000f857777fab548747fa480e23eaf99b2e"},{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"unresolved":false,"context_lines":[{"line_number":210,"context_line":"        try:"},{"line_number":211,"context_line":"            validator \u003d getattr(self, \u0027validate_policy_\u0027 + qos[\u0027type\u0027])"},{"line_number":212,"context_line":"        except AttributeError:"},{"line_number":213,"context_line":"            raise Exception(_(\u0027No validator found for type: %s\u0027) % qos[\u0027type\u0027])"},{"line_number":214,"context_line":"        validator(qos[\u0027policies\u0027])"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def validate_policy_dscp(self, policy):"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAUX%2F%2BrF4%3D","line":213,"updated":"2014-02-19 21:21:50.000000000","message":"There is only one validator for type dscp but none for ratelimit, but the extension specifies both as valid types. Wouldn\u0027t QoS creation fail if someone tried type ratelimit?","commit_id":"46bba000f857777fab548747fa480e23eaf99b2e"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        try:"},{"line_number":211,"context_line":"            validator \u003d getattr(self, \u0027validate_policy_\u0027 + qos[\u0027type\u0027])"},{"line_number":212,"context_line":"        except AttributeError:"},{"line_number":213,"context_line":"            raise Exception(_(\u0027No validator found for type: %s\u0027) % qos[\u0027type\u0027])"},{"line_number":214,"context_line":"        validator(qos[\u0027policies\u0027])"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def validate_policy_dscp(self, policy):"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAUX%2F%2Bq4M%3D","line":213,"in_reply_to":"AAAAUX%2F%2BrF4%3D","updated":"2014-02-19 21:44:11.000000000","message":"Itsuro Oda has implemented a validator in his review for rate limiting, since he will be implementing that policy type in the linuxbridge driver.\n\nhttps://review.openstack.org/#/c/68839/1/neutron/db/qos_db.py","commit_id":"46bba000f857777fab548747fa480e23eaf99b2e"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.extensions import qos as ext_qos"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import sqlalchemy as sa"},{"line_number":26,"context_line":"from sqlalchemy import orm"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class QoSNotFound(exceptions.NotFound):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaQU%3D","line":26,"updated":"2014-03-27 00:56:33.000000000","message":"these imports should be put before neutron\u0027s code imports.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":64,"context_line":"    value \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"},{"line_number":68,"context_line":"    network_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027networks.id\u0027,"},{"line_number":69,"context_line":"                           ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse,"},{"line_number":70,"context_line":"                           primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaOk%3D","line":67,"updated":"2014-03-27 00:56:33.000000000","message":"is qos \u003c--\u003e network a many:many mapping? if not, do we need the association class?","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    value \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"},{"line_number":68,"context_line":"    network_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027networks.id\u0027,"},{"line_number":69,"context_line":"                           ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse,"},{"line_number":70,"context_line":"                           primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCls%3D","line":67,"in_reply_to":"AAAAWH%2F%2BaOk%3D","updated":"2014-03-31 11:30:12.000000000","message":"It is not a many to many mapping - but we still need the intermediate tables, since a QoS can be linked to either a port or a network, so I decided to keep it in 3NF.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":72,"context_line":"                       ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"class PortQoSMapping(model_base.BASEV2):"},{"line_number":76,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":77,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":78,"context_line":"    qos_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027qoses.id\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaOg%3D","line":75,"updated":"2014-03-27 00:56:33.000000000","message":"ditto","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"            db.update(mapping)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def update_qos(self, context, id, qos):"},{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":198,"context_line":"            db.policies \u003d []"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaJk%3D","line":195,"updated":"2014-03-27 00:56:33.000000000","message":"what if I just want to update the \u0027description\" of a qos?","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            db.update(mapping)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def update_qos(self, context, id, qos):"},{"line_number":195,"context_line":"        self.validate_qos(qos)"},{"line_number":196,"context_line":"        db \u003d self._get_by_id(context, QoS, id)"},{"line_number":197,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":198,"context_line":"            db.policies \u003d []"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCk0%3D","line":195,"in_reply_to":"AAAAWH%2F%2BaJk%3D","updated":"2014-03-31 11:30:12.000000000","message":"Good point - will make a unit test to cover that and update this to allow.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":208,"context_line":"            raise ext_qos.QoSValidationError()"},{"line_number":209,"context_line":"        qos \u003d qos[\u0027qos\u0027]"},{"line_number":210,"context_line":"        try:"},{"line_number":211,"context_line":"            validator \u003d getattr(self, \u0027validate_policy_\u0027 + qos[\u0027type\u0027])"},{"line_number":212,"context_line":"        except AttributeError:"},{"line_number":213,"context_line":"            raise Exception(_(\u0027No validator found for type: %s\u0027) % qos[\u0027type\u0027])"},{"line_number":214,"context_line":"        validator(qos[\u0027policies\u0027])"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaIA%3D","line":211,"updated":"2014-03-27 00:56:33.000000000","message":"I still cannot find the validate_policy_ratelimit if the qos type is ratelimit.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            raise ext_qos.QoSValidationError()"},{"line_number":209,"context_line":"        qos \u003d qos[\u0027qos\u0027]"},{"line_number":210,"context_line":"        try:"},{"line_number":211,"context_line":"            validator \u003d getattr(self, \u0027validate_policy_\u0027 + qos[\u0027type\u0027])"},{"line_number":212,"context_line":"        except AttributeError:"},{"line_number":213,"context_line":"            raise Exception(_(\u0027No validator found for type: %s\u0027) % qos[\u0027type\u0027])"},{"line_number":214,"context_line":"        validator(qos[\u0027policies\u0027])"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BZd0%3D","line":211,"in_reply_to":"AAAAWH%2F%2BaIA%3D","updated":"2014-03-27 03:38:36.000000000","message":"That validation is implemented in the Linuxbridge QoS review","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"}],"neutron/extensions/qos.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":44,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":45,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":46,"context_line":"                      \u0027is_visible\u0027: True, \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":47,"context_line":"    },"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F1QE%3D","line":46,"updated":"2013-07-22 14:45:20.000000000","message":"type:uuid?","commit_id":"4b93e9d065cf69bb27006905371aa43a225bfcb6"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":44,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":45,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":46,"context_line":"                      \u0027is_visible\u0027: True, \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":47,"context_line":"    },"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F0%2FQ%3D","line":46,"in_reply_to":"AAAAQn%2F%2F1Ao%3D","updated":"2013-07-22 15:43:07.000000000","message":"No worries, I appreciate your attention to detail.","commit_id":"4b93e9d065cf69bb27006905371aa43a225bfcb6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":44,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":45,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":46,"context_line":"                      \u0027is_visible\u0027: True, \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":47,"context_line":"    },"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F1Ao%3D","line":46,"in_reply_to":"AAAAQn%2F%2F1Fg%3D","updated":"2013-07-22 15:39:56.000000000","message":"Yeah, actually tenant_id is not required to be uuid and type:string is ok. Sorry, please disregard the comment","commit_id":"4b93e9d065cf69bb27006905371aa43a225bfcb6"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":44,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":45,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":46,"context_line":"                      \u0027is_visible\u0027: True, \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":47,"context_line":"    },"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F1Fg%3D","line":46,"in_reply_to":"AAAAQn%2F%2F1H8%3D","updated":"2013-07-22 15:25:11.000000000","message":"Actually, it looks like all the extensions just use:\n\n        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,\n                      \u0027required_by_policy\u0027: True,\n                      \u0027is_visible\u0027: True},","commit_id":"4b93e9d065cf69bb27006905371aa43a225bfcb6"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":44,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":45,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":46,"context_line":"                      \u0027is_visible\u0027: True, \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":47,"context_line":"    },"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F1H8%3D","line":46,"in_reply_to":"AAAAQn%2F%2F1QE%3D","updated":"2013-07-22 15:15:32.000000000","message":"argh, stupid mistake on my part - thanks","commit_id":"4b93e9d065cf69bb27006905371aa43a225bfcb6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":100,"context_line":"        exts \u003d []"},{"line_number":101,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":102,"context_line":"        params \u003d RESOURCE_ATTRIBUTE_MAP.get(\"qos\", dict())"},{"line_number":103,"context_line":"        controller \u003d base.create_resource(\"qoss\","},{"line_number":104,"context_line":"                                          \"qos\","},{"line_number":105,"context_line":"                                          plugin, params, allow_bulk\u003dTrue,"},{"line_number":106,"context_line":"                                          allow_pagination\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F1PI%3D","line":103,"updated":"2013-07-22 14:45:20.000000000","message":"consider qoses","commit_id":"4b93e9d065cf69bb27006905371aa43a225bfcb6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":"#"},{"line_number":17,"context_line":"# @author: Sean M. Collins, sean@coreitpro.com, Comcast #"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from abc import ABCMeta"},{"line_number":20,"context_line":"from abc import abstractmethod"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from neutron.api import extensions"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYEY%3D","line":19,"updated":"2013-09-05 14:25:14.000000000","message":"please use module level imports","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":38,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":39,"context_line":"                 \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":40,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":41,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":42,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":43,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None}},"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYD0%3D","line":40,"updated":"2013-09-05 14:25:14.000000000","message":"type:values: [constants.TYPE_QOS_DSCP, constants.TYPE_QOS_RATELIMIT]","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":38,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":39,"context_line":"                 \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":40,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None}},"},{"line_number":41,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":42,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":43,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None}},"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FXPk%3D","line":40,"in_reply_to":"AAAASn%2F%2FYD0%3D","updated":"2013-09-05 17:22:41.000000000","message":"Good catch - thanks.","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":100,"context_line":"        exts \u003d []"},{"line_number":101,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":102,"context_line":"        params \u003d RESOURCE_ATTRIBUTE_MAP.get(\"qos\", dict())"},{"line_number":103,"context_line":"        controller \u003d base.create_resource(\"qoss\","},{"line_number":104,"context_line":"                                          \"qos\","},{"line_number":105,"context_line":"                                          plugin, params, allow_bulk\u003dTrue,"},{"line_number":106,"context_line":"                                          allow_pagination\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYAs%3D","line":103,"updated":"2013-09-05 14:25:14.000000000","message":"consider qoses","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @classmethod"},{"line_number":96,"context_line":"    def get_resources(cls):"},{"line_number":97,"context_line":"        #TODO(scollins)"},{"line_number":98,"context_line":"        my_plurals \u003d [(key + \u0027es\u0027, key) for key in"},{"line_number":99,"context_line":"                      RESOURCE_ATTRIBUTE_MAP.keys()]"},{"line_number":100,"context_line":"        attr.PLURALS.update(dict(my_plurals))"},{"line_number":101,"context_line":"        exts \u003d []"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Bxc4%3D","line":98,"updated":"2013-11-20 12:06:27.000000000","message":"\u0027es\u0027 seems not generic suffix, I see that you have only one item in RESOURCE_ATTRIBUTE_MAP but probably in this case it\u0027s better to have just:\n my_plurals \u003d [(\u0027qoses\u0027, \u0027qos\u0027)]","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class QoSPluginBase(object):"},{"line_number":124,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @abc.abstractmethod"},{"line_number":127,"context_line":"    def get_qoses(self, context, filters\u003dNone, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2FDso%3D","line":124,"updated":"2013-11-15 02:23:07.000000000","message":"This one is not python3 compatible.\nsee https://review.openstack.org/#/c/51738/","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class QoSPluginBase(object):"},{"line_number":124,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @abc.abstractmethod"},{"line_number":127,"context_line":"    def get_qoses(self, context, filters\u003dNone, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2FBwE%3D","line":124,"in_reply_to":"AAAATn%2F%2FDso%3D","updated":"2013-11-15 13:42:56.000000000","message":"Done","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.common import exceptions as qexception"},{"line_number":26,"context_line":"from neutron import manager"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaQs%3D","line":28,"updated":"2014-03-27 00:56:33.000000000","message":"the third party library should be put after system library imports.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.common import exceptions as qexception"},{"line_number":26,"context_line":"from neutron import manager"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCjk%3D","line":28,"in_reply_to":"AAAAWH%2F%2BaQs%3D","updated":"2014-03-31 11:30:12.000000000","message":"Can you explain? The third party library (six) is put after system library (abc) imports.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":38,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":39,"context_line":"                     \u0027validate\u0027: {\u0027type:dict\u0027: None}},"},{"line_number":40,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":41,"context_line":"                 \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":42,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [constants.TYPE_QOS_DSCP,"},{"line_number":43,"context_line":"                                              constants.TYPE_QOS_RATELIMIT]}},"},{"line_number":44,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaVM%3D","line":41,"updated":"2014-03-27 00:56:33.000000000","message":"if the value must be one of dscp and ratelimit, we should not have default","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":39,"context_line":"                     \u0027validate\u0027: {\u0027type:dict\u0027: None}},"},{"line_number":40,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":41,"context_line":"                 \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":42,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [constants.TYPE_QOS_DSCP,"},{"line_number":43,"context_line":"                                              constants.TYPE_QOS_RATELIMIT]}},"},{"line_number":44,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCjU%3D","line":41,"in_reply_to":"AAAAWH%2F%2BaVM%3D","updated":"2014-03-31 11:30:12.000000000","message":"Done","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":50,"context_line":"    },"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"QOS \u003d \"qos\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":56,"context_line":"    \u0027ports\u0027: {QOS: {\u0027allow_post\u0027: True,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaTk%3D","line":53,"updated":"2014-03-27 00:56:33.000000000","message":"give a namespace, and then put it into namespace:qos?","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    },"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"QOS \u003d \"qos\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":56,"context_line":"    \u0027ports\u0027: {QOS: {\u0027allow_post\u0027: True,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCjM%3D","line":53,"in_reply_to":"AAAAWH%2F%2BaTk%3D","updated":"2014-03-31 11:30:12.000000000","message":"Done","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":91,"context_line":"        pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_updated(cls):"},{"line_number":94,"context_line":"        #TODO(scollins)"},{"line_number":95,"context_line":"        pass"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaTI%3D","line":94,"updated":"2014-03-27 00:56:33.000000000","message":"to do what?","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @classmethod"},{"line_number":98,"context_line":"    def get_resources(cls):"},{"line_number":99,"context_line":"        #TODO(scollins)"},{"line_number":100,"context_line":"        my_plurals \u003d [(key + \u0027es\u0027, key) for key in"},{"line_number":101,"context_line":"                      RESOURCE_ATTRIBUTE_MAP.keys()]"},{"line_number":102,"context_line":"        attr.PLURALS.update(dict(my_plurals))"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaSw%3D","line":99,"updated":"2014-03-27 00:56:33.000000000","message":"to do what?","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":101,"context_line":"                      RESOURCE_ATTRIBUTE_MAP.keys()]"},{"line_number":102,"context_line":"        attr.PLURALS.update(dict(my_plurals))"},{"line_number":103,"context_line":"        exts \u003d []"},{"line_number":104,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":105,"context_line":"        params \u003d RESOURCE_ATTRIBUTE_MAP.get(\"qos\", dict())"},{"line_number":106,"context_line":"        controller \u003d base.create_resource(\"qoses\","},{"line_number":107,"context_line":"                                          \"qos\","}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaRk%3D","line":104,"updated":"2014-03-27 00:56:33.000000000","message":"try to use the helper at https://github.com/openstack/neutron/blob/master/neutron/api/v2/resource_helper.py#L40","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"}],"neutron/tests/unit/test_extension_qos.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":176,"context_line":"        super(QoSDBTestCase, self).setUp(plugin)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def tearDown(self):"},{"line_number":179,"context_line":"        del test_config[\u0027plugin_name_v2\u0027]"},{"line_number":180,"context_line":"        super(QoSDBTestCase, self).tearDown()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYBU%3D","line":179,"updated":"2013-09-05 14:25:14.000000000","message":"consider using self.addCleanUp() in setUp()","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":230,"context_line":"                                                  n[\u0027network\u0027][\u0027id\u0027])"},{"line_number":231,"context_line":"                    res \u003d self.deserialize(self.fmt,"},{"line_number":232,"context_line":"                                           req.get_response(self.api))"},{"line_number":233,"context_line":"                    self.assertTrue(ext_qos.QOS not in res[\u0027network\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def test_delete_mapping_for_port(self):"},{"line_number":236,"context_line":"        with self.network() as n:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYB4%3D","line":233,"updated":"2013-09-05 14:25:14.000000000","message":"assertNotIn","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":251,"context_line":"                    res \u003d self.deserialize(self.fmt, req.get_response("},{"line_number":252,"context_line":"                                           self.api))"},{"line_number":253,"context_line":"                    self.assertTrue(ext_qos.QOS not in res[\u0027port\u0027])"},{"line_number":254,"context_line":"                self._delete(\u0027ports\u0027, res[\u0027port\u0027][\u0027id\u0027])"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    def test_get_network_qos(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYB0%3D","line":253,"updated":"2013-09-05 14:25:14.000000000","message":"assertNotIn","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":298,"context_line":"                  \u0027policy\u0027: \u0027DEADBEEF\u0027}"},{"line_number":299,"context_line":"        resp \u003d self._create_qos(policy[\u0027type\u0027], policy[\u0027description\u0027],"},{"line_number":300,"context_line":"                                policy[\u0027policy\u0027])"},{"line_number":301,"context_line":"        self.assertTrue(ext_qos.QoSValidationError.message in resp.body)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def test_invalid_update_qos(self):"},{"line_number":304,"context_line":"        with self.qos(self.default_qos) as qos:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAASn%2F%2FYBs%3D","line":301,"updated":"2013-09-05 14:25:14.000000000","message":"assertIn","commit_id":"9f2c1383617d8fe7a366fa60646645164505febb"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":240,"context_line":"                                                  n[\u0027network\u0027][\u0027id\u0027])"},{"line_number":241,"context_line":"                    res \u003d self.deserialize(self.fmt,"},{"line_number":242,"context_line":"                                           req.get_response(self.api))"},{"line_number":243,"context_line":"                    self.assertTrue(ext_qos.QOS not in res[\u0027network\u0027])"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def test_delete_mapping_for_port(self):"},{"line_number":246,"context_line":"        with self.network() as n:"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2nU%3D","line":243,"updated":"2013-09-18 08:10:39.000000000","message":"please use self.assertNotIn()","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":260,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":261,"context_line":"                    res \u003d self.deserialize(self.fmt, req.get_response("},{"line_number":262,"context_line":"                                           self.api))"},{"line_number":263,"context_line":"                    self.assertTrue(ext_qos.QOS not in res[\u0027port\u0027])"},{"line_number":264,"context_line":"                self._delete(\u0027ports\u0027, res[\u0027port\u0027][\u0027id\u0027])"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_get_network_qos(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2nE%3D","line":263,"updated":"2013-09-18 08:10:39.000000000","message":"ditto","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":306,"context_line":"        resp \u003d self._create_qos(self.invalid_policy[\u0027type\u0027],"},{"line_number":307,"context_line":"                                self.invalid_policy[\u0027description\u0027],"},{"line_number":308,"context_line":"                                self.invalid_policy[\u0027policy\u0027])"},{"line_number":309,"context_line":"        self.assertTrue(ext_qos.QoSValidationError.message in resp.body)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def test_invalid_update_qos(self):"},{"line_number":312,"context_line":"        with self.qos(self.default_qos) as qos:"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2F2m0%3D","line":309,"updated":"2013-09-18 08:10:39.000000000","message":"self.assertIn","commit_id":"28673dd0537ca6c90fcc5311f1cbdaea82140db7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"# @author: Sean M. Collins, sean@coreitpro.com, Comcast #"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import contextlib"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import webob.exc"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.api.v2 import attributes as attr"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Bxcw%3D","line":20,"updated":"2013-11-20 12:06:27.000000000","message":"no need for an empty line","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":164,"context_line":"        self.invalid_policy \u003d SAMPLE_INVALID_QOS"},{"line_number":165,"context_line":"        test_config[\u0027plugin_name_v2\u0027] \u003d DB_PLUGIN_KLASS"},{"line_number":166,"context_line":"        ext_mgr \u003d QoSTestExtensionManager()"},{"line_number":167,"context_line":"        test_config[\u0027extension_manager\u0027] \u003d ext_mgr"},{"line_number":168,"context_line":"        super(QoSDBTestCase, self).setUp(plugin)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2BxbE%3D","line":167,"updated":"2013-11-20 12:06:27.000000000","message":"can pass ext_mgr directly to \n super(QoSDBTestCase, self).setUp(plugin, ext_mgr\u003dext_mgr)\nhence no need for tearDown() as well","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":184,"context_line":"                self.assertEqual(res[\u0027network\u0027][ext_qos.QOS], qos[\u0027qos\u0027][\u0027id\u0027])"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def test_add_mapping_to_port(self):"},{"line_number":187,"context_line":"        with self.network() as n:"},{"line_number":188,"context_line":"            with self.subnet(n):"},{"line_number":189,"context_line":"                with self.qos(self.default_qos) as qos:"},{"line_number":190,"context_line":"                    res \u003d self._create_port(self.fmt, n[\u0027network\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAATn%2F%2Bxaw%3D","line":187,"updated":"2013-11-20 12:06:27.000000000","message":"consider using contextlib.nested() here and in other methods","commit_id":"85fda24fe763c979c319567f5f35aa0103c7bc02"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAUH%2F%2BTvo%3D","line":3,"updated":"2014-01-28 05:35:18.000000000","message":"The year should probably be changed to 2014","commit_id":"e19cd118f1438d85bd1b6fa438637a1cfa678586"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":21,"context_line":"import webob.exc"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.api.v2 import attributes as attr"},{"line_number":24,"context_line":"from neutron.common.test_lib import test_config"},{"line_number":25,"context_line":"from neutron.db import db_base_plugin_v2"},{"line_number":26,"context_line":"from neutron.db import qos_db"},{"line_number":27,"context_line":"from neutron.extensions import qos as ext_qos"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAUX%2F%2BoXs%3D","line":24,"updated":"2014-02-20 04:49:10.000000000","message":"this line is not necessaty after all.","commit_id":"88d4e7cfe3e715435e02ca64ae7afa84339c310a"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.default_qos \u003d SAMPLE_QOS"},{"line_number":163,"context_line":"        self.update_qos \u003d SAMPLE_UPDATE_QOS"},{"line_number":164,"context_line":"        self.invalid_policy \u003d SAMPLE_INVALID_QOS"},{"line_number":165,"context_line":"        ext_mgr \u003d ext_mgr or QoSTestExtensionManager()"},{"line_number":166,"context_line":"        test_config[\u0027extension_manager\u0027] \u003d ext_mgr"},{"line_number":167,"context_line":"        super(QoSDBTestCase, self).setUp(plugin\u003dplugin, ext_mgr\u003dext_mgr)"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAUX%2F%2BoZ8%3D","line":165,"updated":"2014-02-20 04:49:10.000000000","message":"add\n\nplugin \u003d plugin or \u0027neutron.tests.unit.test_extension_qos.QoSTestPlugin\u0027","commit_id":"88d4e7cfe3e715435e02ca64ae7afa84339c310a"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":163,"context_line":"        self.update_qos \u003d SAMPLE_UPDATE_QOS"},{"line_number":164,"context_line":"        self.invalid_policy \u003d SAMPLE_INVALID_QOS"},{"line_number":165,"context_line":"        ext_mgr \u003d ext_mgr or QoSTestExtensionManager()"},{"line_number":166,"context_line":"        test_config[\u0027extension_manager\u0027] \u003d ext_mgr"},{"line_number":167,"context_line":"        super(QoSDBTestCase, self).setUp(plugin\u003dplugin, ext_mgr\u003dext_mgr)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAUX%2F%2BoaU%3D","line":166,"updated":"2014-02-20 04:49:10.000000000","message":"remove this line since it is not necessary.","commit_id":"88d4e7cfe3e715435e02ca64ae7afa84339c310a"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":167,"context_line":"        super(QoSDBTestCase, self).setUp(plugin\u003dplugin, ext_mgr\u003dext_mgr)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def tearDown(self):"},{"line_number":170,"context_line":"        del test_config[\u0027plugin_name_v2\u0027]"},{"line_number":171,"context_line":"        super(QoSDBTestCase, self).tearDown()"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAUX%2F%2BoZo%3D","line":170,"updated":"2014-02-20 04:49:10.000000000","message":"remove this line since no one set \u0027plugin_name_v2\u0027.","commit_id":"88d4e7cfe3e715435e02ca64ae7afa84339c310a"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"SAMPLE_INVALID_QOS \u003d {\u0027type\u0027: \u0027dscp\u0027, \u0027description\u0027:"},{"line_number":42,"context_line":"                      \u0027sample invalid polciy\u0027,"},{"line_number":43,"context_line":"                      \u0027policies\u0027: {\u0027dscp\u0027: \u0027900\u0027}}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class QoSTestExtensionManager(object):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaHM%3D","line":43,"updated":"2014-03-27 00:56:33.000000000","message":"why not test the ratelimit qos?","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"SAMPLE_INVALID_QOS \u003d {\u0027type\u0027: \u0027dscp\u0027, \u0027description\u0027:"},{"line_number":42,"context_line":"                      \u0027sample invalid polciy\u0027,"},{"line_number":43,"context_line":"                      \u0027policies\u0027: {\u0027dscp\u0027: \u0027900\u0027}}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class QoSTestExtensionManager(object):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCis%3D","line":43,"in_reply_to":"AAAAWH%2F%2BaHM%3D","updated":"2014-03-31 11:30:12.000000000","message":"Ratelimit was left for another patch set to implement.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class QoSTestCase(test_db_plugin.NeutronDbPluginV2TestCase):"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _create_qos(self, qos_type, description, policy):"},{"line_number":61,"context_line":"        data \u003d {\u0027qos\u0027: {\u0027policies\u0027: policy,"},{"line_number":62,"context_line":"                        \u0027tenant_id\u0027: \u0027test_tenant\u0027,"},{"line_number":63,"context_line":"                        \u0027description\u0027: description,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaHE%3D","line":60,"updated":"2014-03-27 00:56:33.000000000","message":"policy -\u003e policies","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class QoSTestCase(test_db_plugin.NeutronDbPluginV2TestCase):"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _create_qos(self, qos_type, description, policy):"},{"line_number":61,"context_line":"        data \u003d {\u0027qos\u0027: {\u0027policies\u0027: policy,"},{"line_number":62,"context_line":"                        \u0027tenant_id\u0027: \u0027test_tenant\u0027,"},{"line_number":63,"context_line":"                        \u0027description\u0027: description,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCio%3D","line":60,"in_reply_to":"AAAAWH%2F%2BaHE%3D","updated":"2014-03-31 11:30:12.000000000","message":"Done","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":75,"context_line":"        return self.deserialize(self.fmt, res)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @contextlib.contextmanager"},{"line_number":78,"context_line":"    def qos(self, policy, no_delete\u003dFalse):"},{"line_number":79,"context_line":"        qos \u003d self._make_qos(policy)"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            yield qos"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaGk%3D","line":78,"updated":"2014-03-27 00:56:33.000000000","message":"policy -\u003e qos?","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        return self.deserialize(self.fmt, res)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @contextlib.contextmanager"},{"line_number":78,"context_line":"    def qos(self, policy, no_delete\u003dFalse):"},{"line_number":79,"context_line":"        qos \u003d self._make_qos(policy)"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            yield qos"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCik%3D","line":78,"in_reply_to":"AAAAWH%2F%2BaGk%3D","updated":"2014-03-31 11:30:12.000000000","message":"Done","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":123,"context_line":"        mapping \u003d self.get_mapping_for_port(context, id)"},{"line_number":124,"context_line":"        if qos_id and not mapping:"},{"line_number":125,"context_line":"            self.create_qos_for_port(context, port[\u0027port\u0027][\u0027qos\u0027], id)"},{"line_number":126,"context_line":"        elif not qos_id and mapping:"},{"line_number":127,"context_line":"            self.delete_qos_for_port(context, id)"},{"line_number":128,"context_line":"        else:"},{"line_number":129,"context_line":"            qos_id \u003d port[\u0027port\u0027][\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BaBM%3D","line":126,"updated":"2014-03-27 01:38:26.000000000","message":"what do u mean by this? do I have to carry the qos_id in port every time I update a port? for example, if I just want to update the port\u0027s name.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        mapping \u003d self.get_mapping_for_port(context, id)"},{"line_number":124,"context_line":"        if qos_id and not mapping:"},{"line_number":125,"context_line":"            self.create_qos_for_port(context, port[\u0027port\u0027][\u0027qos\u0027], id)"},{"line_number":126,"context_line":"        elif not qos_id and mapping:"},{"line_number":127,"context_line":"            self.delete_qos_for_port(context, id)"},{"line_number":128,"context_line":"        else:"},{"line_number":129,"context_line":"            qos_id \u003d port[\u0027port\u0027][\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BCiM%3D","line":126,"in_reply_to":"AAAAWH%2F%2BaBM%3D","updated":"2014-03-31 11:30:12.000000000","message":"Agreed this needs to be fixed","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":214,"context_line":"                    self.assertEqual(res[\u0027network\u0027][ext_qos.QOS],"},{"line_number":215,"context_line":"                                     qos[\u0027qos\u0027][\u0027id\u0027])"},{"line_number":216,"context_line":"                    del data[\u0027network\u0027][ext_qos.QOS]"},{"line_number":217,"context_line":"                    req \u003d self.new_update_request(\u0027networks\u0027,"},{"line_number":218,"context_line":"                                                  data,"},{"line_number":219,"context_line":"                                                  n[\u0027network\u0027][\u0027id\u0027])"},{"line_number":220,"context_line":"                    res \u003d self.deserialize(self.fmt,"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BZ%2B0%3D","line":217,"updated":"2014-03-27 01:38:26.000000000","message":"we cannot delete the qos just because we have no qos in the request data.","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":235,"context_line":"                    res \u003d self.deserialize(self.fmt,"},{"line_number":236,"context_line":"                                           req.get_response(self.api))"},{"line_number":237,"context_line":"                    del data[\u0027port\u0027][ext_qos.QOS]"},{"line_number":238,"context_line":"                    req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":239,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":240,"context_line":"                    res \u003d self.deserialize(self.fmt, req.get_response("},{"line_number":241,"context_line":"                                           self.api))"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAWH%2F%2BZ%2Bw%3D","line":238,"updated":"2014-03-27 01:38:26.000000000","message":"ditto","commit_id":"eb3ba01b99a6a390f810e5039a0d8b887308a981"}],"quantum/db/migration/alembic_migrations/versions/562fa8b1d4b5_add_qos_.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"migration_for_plugins \u003d ["},{"line_number":33,"context_line":"    \u0027quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2\u0027,"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fco8%3D","line":33,"updated":"2013-05-09 10:31:06.000000000","message":"is blueprint quantum-qos-api relevant only for Quantum OVS plugin?","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"migration_for_plugins \u003d ["},{"line_number":33,"context_line":"    \u0027quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2\u0027,"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcXI%3D","line":33,"in_reply_to":"AAAAOn%2F%2Fco8%3D","updated":"2013-05-09 14:46:56.000000000","message":"My goal is to have a flexible enough DB model, so that we could migrate the QoS DB models from the Nicira and Cisco plugins over to this as well. That\u0027s a big chunk of work though, so I have left that for later :).\n\nI will also be writing a QoS implementation for OpenVSwitch - but that is a blueprint I have yet to write.","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    op.create_table("},{"line_number":56,"context_line":"        \u0027networkqosmappings\u0027,"},{"line_number":57,"context_line":"        sa.Column(\u0027network\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":58,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":59,"context_line":"        sa.ForeignKeyConstraint([\u0027network\u0027], [\u0027network.id\u0027],"},{"line_number":60,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcpM%3D","line":57,"updated":"2013-05-09 10:31:06.000000000","message":"add a composite primary key constraint on [\u0027network\u0027, \u0027qos\u0027] to ensure a DB index is created","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":59,"context_line":"        sa.ForeignKeyConstraint([\u0027network\u0027], [\u0027network.id\u0027],"},{"line_number":60,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":61,"context_line":"        sa.ForeignKeyConstraint([\u0027qos\u0027], [\u0027qos.id\u0027],),"},{"line_number":62,"context_line":"    )"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fcpg%3D","line":61,"updated":"2013-05-09 10:31:06.000000000","message":"ondelete\u003d\u0027CASCADE\u0027?","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":59,"context_line":"        sa.ForeignKeyConstraint([\u0027network\u0027], [\u0027network.id\u0027],"},{"line_number":60,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":61,"context_line":"        sa.ForeignKeyConstraint([\u0027qos\u0027], [\u0027qos.id\u0027],),"},{"line_number":62,"context_line":"    )"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcXE%3D","line":61,"in_reply_to":"AAAAOn%2F%2Fcpg%3D","updated":"2013-05-09 14:46:56.000000000","message":"Done","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    op.create_table("},{"line_number":65,"context_line":"        \u0027portqosmappings\u0027,"},{"line_number":66,"context_line":"        sa.Column(\u0027port\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":67,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":68,"context_line":"        sa.ForeignKeyConstraint([\u0027port\u0027], [\u0027ports.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":69,"context_line":"        sa.ForeignKeyConstraint([\u0027qos\u0027], [\u0027qos.id\u0027],),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcpU%3D","line":66,"updated":"2013-05-09 10:31:06.000000000","message":"add a composite primary key constraint on [\u0027port\u0027, \u0027qos\u0027] to ensure a DB index is created","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        sa.Column(\u0027port\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":67,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":68,"context_line":"        sa.ForeignKeyConstraint([\u0027port\u0027], [\u0027ports.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":69,"context_line":"        sa.ForeignKeyConstraint([\u0027qos\u0027], [\u0027qos.id\u0027],),"},{"line_number":70,"context_line":"    )"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcpY%3D","line":69,"updated":"2013-05-09 10:31:06.000000000","message":"ondelete\u003d\u0027CASCADE\u0027?","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        sa.Column(\u0027port\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":67,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":68,"context_line":"        sa.ForeignKeyConstraint([\u0027port\u0027], [\u0027ports.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":69,"context_line":"        sa.ForeignKeyConstraint([\u0027qos\u0027], [\u0027qos.id\u0027],),"},{"line_number":70,"context_line":"    )"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcXA%3D","line":69,"in_reply_to":"AAAAOn%2F%2FcpY%3D","updated":"2013-05-09 14:46:56.000000000","message":"Done","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    op.create_table("},{"line_number":73,"context_line":"        \u0027subnetqosmappings\u0027,"},{"line_number":74,"context_line":"        sa.Column(\u0027subnet_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":75,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":76,"context_line":"        sa.ForeignKeyConstraint([\u0027subnet_id\u0027], [\u0027subnets.id\u0027],"},{"line_number":77,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcpQ%3D","line":74,"updated":"2013-05-09 10:31:06.000000000","message":"rename the \u0027subnet_id\u0027 column to \u0027subnet\u0027 to ensure it is consistent with two other mappings\n\nadd a composite primary key constraint on [\u0027subnet\u0027, \u0027qos\u0027] to ensure a DB index is created","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    op.create_table("},{"line_number":73,"context_line":"        \u0027subnetqosmappings\u0027,"},{"line_number":74,"context_line":"        sa.Column(\u0027subnet_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":75,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":76,"context_line":"        sa.ForeignKeyConstraint([\u0027subnet_id\u0027], [\u0027subnets.id\u0027],"},{"line_number":77,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcDI%3D","line":74,"in_reply_to":"AAAAOn%2F%2FcpQ%3D","updated":"2013-05-09 17:15:16.000000000","message":"Done","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":76,"context_line":"        sa.ForeignKeyConstraint([\u0027subnet_id\u0027], [\u0027subnets.id\u0027],"},{"line_number":77,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":78,"context_line":"        sa.ForeignKeyConstraint([\u0027qos\u0027], [\u0027qos.id\u0027],),"},{"line_number":79,"context_line":"    )"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fcpc%3D","line":78,"updated":"2013-05-09 10:31:06.000000000","message":"ondelete\u003d\u0027CASCADE\u0027?","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        sa.Column(\u0027qos\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":76,"context_line":"        sa.ForeignKeyConstraint([\u0027subnet_id\u0027], [\u0027subnets.id\u0027],"},{"line_number":77,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":78,"context_line":"        sa.ForeignKeyConstraint([\u0027qos\u0027], [\u0027qos.id\u0027],),"},{"line_number":79,"context_line":"    )"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcW8%3D","line":78,"in_reply_to":"AAAAOn%2F%2Fcpc%3D","updated":"2013-05-09 14:46:56.000000000","message":"Done","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    if not migration.should_run(active_plugin, migration_for_plugins):"},{"line_number":84,"context_line":"        return"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    op.drop_table(\u0027qos\u0027)"},{"line_number":87,"context_line":"    op.drop_table(\u0027portqosmappings\u0027)"},{"line_number":88,"context_line":"    op.drop_table(\u0027subnetqosmappings\u0027)"},{"line_number":89,"context_line":"    op.drop_table(\u0027networkqosmappings\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcpE%3D","line":86,"updated":"2013-05-09 10:31:06.000000000","message":"shouldn\u0027t mappings tables be dropped first (as they contain FK references to qos table)?","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    if not migration.should_run(active_plugin, migration_for_plugins):"},{"line_number":84,"context_line":"        return"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    op.drop_table(\u0027qos\u0027)"},{"line_number":87,"context_line":"    op.drop_table(\u0027portqosmappings\u0027)"},{"line_number":88,"context_line":"    op.drop_table(\u0027subnetqosmappings\u0027)"},{"line_number":89,"context_line":"    op.drop_table(\u0027networkqosmappings\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcW4%3D","line":86,"in_reply_to":"AAAAOn%2F%2FcpE%3D","updated":"2013-05-09 14:46:56.000000000","message":"Whoops! :)","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"}],"quantum/db/qos_db.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from sqlalchemy import Column, ForeignKey, String"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from quantum.db import model_base"},{"line_number":4,"context_line":"from quantum.db import models_v2"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fcro%3D","line":1,"updated":"2013-05-09 10:31:06.000000000","message":"nit: AFAIK, multiple imports in one line are strongly discouraged, consider using of: import sqlalchemy as sa","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from sqlalchemy import Column, ForeignKey, String"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from quantum.db import model_base"},{"line_number":4,"context_line":"from quantum.db import models_v2"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcZY%3D","line":1,"in_reply_to":"AAAAOn%2F%2Fcro%3D","updated":"2013-05-09 14:40:08.000000000","message":"Done","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":3,"context_line":"from quantum.db import model_base"},{"line_number":4,"context_line":"from quantum.db import models_v2"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"class NetworkQosMapping(model_base.BASEV2):"},{"line_number":8,"context_line":"    network \u003d Column(String(36), ForeignKey(\"network.id\"), nullable\u003dFalse)"},{"line_number":9,"context_line":"    qos \u003d Column(String(36), ForeignKey(\"qos.id\"), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fcq8%3D","line":6,"updated":"2013-05-09 10:31:06.000000000","message":"All foreign keys below can benefit from defining ondelete\u003d\"CASCADE\" for them (http://docs.sqlalchemy.org/en/latest/core/schema.html#on-update-and-on-delete), as these models are just auxiliary association tables, and all corresponding associations should be deleted when a parent instance is deleted.\n\nIt\u0027s also reasonable to specify a composite primary key constraint on both columns of association tables to ensure a DB index is created and JOIN operations are performed fast.\n\norm.relationship() attributes can be useful for retrieving of associated QoS instances, defined for a particular parent model.","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    qos \u003d Column(String(36), ForeignKey(\"qos.id\"), nullable\u003dFalse)"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":18,"context_line":"    action \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcrY%3D","line":17,"updated":"2013-05-09 10:31:06.000000000","message":"nit: I think it\u0027s better to put the definition of this class before mappings","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    qos \u003d Column(String(36), ForeignKey(\"qos.id\"), nullable\u003dFalse)"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":18,"context_line":"    action \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcA8%3D","line":17,"in_reply_to":"AAAAOn%2F%2FcrY%3D","updated":"2013-05-09 17:36:06.000000000","message":"Agreed - was split between doing it alphabetically vs by dependency in the DB.","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    qos \u003d Column(String(36), ForeignKey(\"qos.id\"), nullable\u003dFalse)"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":18,"context_line":"    action \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcZQ%3D","line":17,"in_reply_to":"AAAAOn%2F%2FcrY%3D","updated":"2013-05-09 14:40:08.000000000","message":"Done","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"63eb6d835c3e67e1f1879dad7f212938bbd6312b","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":18,"context_line":"    action \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class SubnetQosMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcqE%3D","line":18,"updated":"2013-05-09 10:31:06.000000000","message":"As far as I understand, the \u0027action\u0027 column is going to be used for storing of JSON serialized strings. In that case, I think, it makes sense to use a custom SQLAlchemy column type defined here http://docs.sqlalchemy.org/en/rel_0_7/orm/extensions/mutable.html#establishing-mutability-on-scalar-column-values","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":18,"context_line":"    action \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class SubnetQosMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FcYU%3D","line":18,"in_reply_to":"AAAAOn%2F%2FcqE%3D","updated":"2013-05-09 14:40:08.000000000","message":"Thanks! I\u0027ll take a look!\n\nI\u0027m beginning to think that even the column name is a bit too narrow - either I need to add more columns or rename it to something bigger.\n\nFor example, what if I only want to mark or rate limit TCP packets only on a specific port - currently with the action column you\u0027d have to write extra attributes inside the action column - which sort of breaks the meaning of \"action\". \n\nPerhaps I should just rename action to qos? That way you could pack all kinds of attributes into the column.\n\nDownside is the access syntax would be Qos.qos, which might be a little ugly.","commit_id":"7a90eddbcde88008f7e3621db186a18108893aaf"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":7,"context_line":"    action \u003d sa.PickleType()"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"class NetworkQosMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FamM%3D","line":7,"updated":"2013-05-10 09:58:27.000000000","message":"The use of pickle probably needs an explanation, as it is not evident at all from your blueprint why one would treat a QoS description as a serialization of a Python object.\n\nI guess the goal here is plugin independence, but I reckon there are other ways to achieve that - for instance plugins typically extend the base model for adapting it to their specific model.","commit_id":"681157c7a56e198ddf9b43c3a50f0cdfa559ca6c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":7,"context_line":"    action \u003d sa.PickleType()"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"class NetworkQosMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FaQw%3D","line":7,"in_reply_to":"AAAAOn%2F%2FamM%3D","updated":"2013-05-10 14:43:08.000000000","message":"Regarding the PickleType, I was hoping to take a shortcut and not define a new column type in SQLAlchemy (http://docs.sqlalchemy.org/en/latest/orm/extensions/mutable.html), while still allowing for flexibility in the Python code. Previously, I was trying to store JSON data as Varchar(255), but that was because I wasn\u0027t as familiar with SQLAlchemy as I am with other ORM libs.\n\nYou are correct - plugins typically extend a base model, but I was hoping that at least we could get a common DB model working, as opposed to the way the Nicira and Cisco plugins have their own DB models.","commit_id":"681157c7a56e198ddf9b43c3a50f0cdfa559ca6c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":9,"context_line":""},{"line_number":10,"context_line":"class NetworkQosMapping(model_base.BASEV2):"},{"line_number":11,"context_line":"    network \u003d sa.Column(sa.String(36), sa.ForeignKey(\"network.id\"),"},{"line_number":12,"context_line":"                        nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":13,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\"qos.id\"),"},{"line_number":14,"context_line":"                    nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FamE%3D","line":12,"updated":"2013-05-10 09:58:27.000000000","message":"If you added cascades to the migration, they should probably be here too.","commit_id":"681157c7a56e198ddf9b43c3a50f0cdfa559ca6c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":9,"context_line":""},{"line_number":10,"context_line":"class NetworkQosMapping(model_base.BASEV2):"},{"line_number":11,"context_line":"    network \u003d sa.Column(sa.String(36), sa.ForeignKey(\"network.id\"),"},{"line_number":12,"context_line":"                        nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":13,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\"qos.id\"),"},{"line_number":14,"context_line":"                    nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FaSI%3D","line":12,"in_reply_to":"AAAAOn%2F%2FamE%3D","updated":"2013-05-10 14:43:08.000000000","message":"Done","commit_id":"681157c7a56e198ddf9b43c3a50f0cdfa559ca6c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"from quantum.db import model_base"},{"line_number":2,"context_line":"from quantum.db import models_v2"},{"line_number":3,"context_line":"import sqlalchemy as sa"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FXB8%3D","line":1,"updated":"2013-05-13 17:20:33.000000000","message":"please add in the license header","commit_id":"9fe5d0140783d2398f8f6c57347257778c30233a"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from quantum.db import model_base"},{"line_number":2,"context_line":"from quantum.db import models_v2"},{"line_number":3,"context_line":"import sqlalchemy as sa"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAO3%2F%2F%2Br0%3D","line":1,"in_reply_to":"AAAAOn%2F%2FXB8%3D","updated":"2013-05-15 17:48:54.000000000","message":"Done","commit_id":"9fe5d0140783d2398f8f6c57347257778c30233a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"from quantum.db import model_base"},{"line_number":2,"context_line":"from quantum.db import models_v2"},{"line_number":3,"context_line":"import sqlalchemy as sa"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FXB4%3D","line":3,"updated":"2013-05-13 17:20:33.000000000","message":"please look at the HACKING.rst to see the import orders","commit_id":"9fe5d0140783d2398f8f6c57347257778c30233a"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from quantum.db import model_base"},{"line_number":2,"context_line":"from quantum.db import models_v2"},{"line_number":3,"context_line":"import sqlalchemy as sa"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAO3%2F%2F%2Brw%3D","line":3,"in_reply_to":"AAAAOn%2F%2FXB4%3D","updated":"2013-05-15 17:48:54.000000000","message":"Done","commit_id":"9fe5d0140783d2398f8f6c57347257778c30233a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":21,"context_line":"                    nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class SubnetQosMapping(model_base.BASEV2):"},{"line_number":25,"context_line":"    subnet \u003d sa.Column(sa.String(36), sa.ForeignKey(\"subnets.id\"),"},{"line_number":26,"context_line":"                       nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":27,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\"qos.id\"),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FXBk%3D","line":24,"updated":"2013-05-13 17:20:33.000000000","message":"i can understand network and port qos policies. subnet policies are unclear.","commit_id":"9fe5d0140783d2398f8f6c57347257778c30233a"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":21,"context_line":"                    nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class SubnetQosMapping(model_base.BASEV2):"},{"line_number":25,"context_line":"    subnet \u003d sa.Column(sa.String(36), sa.ForeignKey(\"subnets.id\"),"},{"line_number":26,"context_line":"                       nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":27,"context_line":"    qos \u003d sa.Column(sa.String(36), sa.ForeignKey(\"qos.id\"),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FXAA%3D","line":24,"in_reply_to":"AAAAOn%2F%2FXBk%3D","updated":"2013-05-13 17:24:40.000000000","message":"We would like to have the flexibility to add QoS policies to an entire subnet that is owned by a tenant.","commit_id":"9fe5d0140783d2398f8f6c57347257778c30233a"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    policy \u003d sa.PickleType()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2Fb1s%3D","line":27,"updated":"2013-06-04 01:21:12.000000000","message":"I think we should have this defined.","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    policy \u003d sa.PickleType()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F%2FJU%3D","line":27,"in_reply_to":"AAAAPH%2F%2Fb1s%3D","updated":"2013-06-04 14:24:26.000000000","message":"Not sure what you mean by defined.\n\nAlso - this bit of code is an errror - it should be declared as a sa.Coluumn(sa.PickleType(), nullable\u003dFalse). I have an updated patch that I\u0027m working on that fixes this.","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    policy \u003d sa.PickleType()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F90E%3D","line":27,"in_reply_to":"AAAAPX%2F%2F%2FJU%3D","updated":"2013-06-05 00:11:36.000000000","message":"https://github.com/openstack/quantum/blob/master/quantum/plugins/nicira/nicira_qos_db.py#L31","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"                    nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class QoSDbMixin(ext_qos.QoSPluginBase):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _create_qos_dict(self, qos, fields\u003dNone):"},{"line_number":54,"context_line":"        res \u003d {\u0027id\u0027: qos[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2Fb10%3D","line":51,"updated":"2013-06-04 01:21:12.000000000","message":"looks like there is a lot of work here to do still :)","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                    nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class QoSDbMixin(ext_qos.QoSPluginBase):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _create_qos_dict(self, qos, fields\u003dNone):"},{"line_number":54,"context_line":"        res \u003d {\u0027id\u0027: qos[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F%2FJE%3D","line":51,"in_reply_to":"AAAAPH%2F%2Fb10%3D","updated":"2013-06-04 14:24:26.000000000","message":"Yup. I\u0027ve got this mostly done in a patch I haven\u0027t posted yet. I\u0027m working on the unit tests for creating *QoSMappings via the REST API.","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    policy \u003d sa.Column(sa.PickleType(), nullable\u003dFalse)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2FmzE%3D","line":27,"updated":"2013-06-26 21:08:34.000000000","message":"IMO, I would refrain from storying json object in the DB, mainly for performance reasons, let alone security ones. Have you considered storing just a list of key-value pairs?","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    policy \u003d sa.Column(sa.PickleType(), nullable\u003dFalse)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Ff6Y%3D","line":27,"in_reply_to":"AAAAPn%2F%2Fj5M%3D","updated":"2013-06-29 06:14:34.000000000","message":"I agree with Armando as well. I\u0027d like this to be explicit like all the over db stuff in quantum.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    policy \u003d sa.Column(sa.PickleType(), nullable\u003dFalse)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Fj5M%3D","line":27,"in_reply_to":"AAAAPn%2F%2Fj8k%3D","updated":"2013-06-27 19:03:09.000000000","message":"Sorry - three rows total.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    policy \u003d sa.Column(sa.PickleType(), nullable\u003dFalse)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NetworkQoSMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Fj8k%3D","line":27,"in_reply_to":"AAAAPn%2F%2FmzE%3D","updated":"2013-06-27 18:53:27.000000000","message":"Perhaps turn the policy column into a table, two rows, one being a foreign key back to the QoS table and the other row being the for the key-value pair?","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    type \u003d sa.Column(sa.Enum(\"dscp\", \"ratelimit\"))"},{"line_number":28,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":29,"context_line":"    policy \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3Bw%3D","line":27,"updated":"2013-07-10 09:19:17.000000000","message":"maybe it worth to define qos types in consts.py ?","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class QoS(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":27,"context_line":"    type \u003d sa.Column(sa.Enum(\"dscp\", \"ratelimit\"))"},{"line_number":28,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":29,"context_line":"    policy \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fo0c%3D","line":27,"in_reply_to":"AAAAP3%2F%2F3Bw%3D","updated":"2013-07-15 15:03:58.000000000","message":"Good idea - thanks.","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._db_delete(context,"},{"line_number":91,"context_line":"                        self._model_query(context,"},{"line_number":92,"context_line":"                                          NetworkQoSMapping)"},{"line_number":93,"context_line":"                        .filter(NetworkQoSMapping.network \u003d\u003d id).one())"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def delete_qos_for_port(self, context, id):"},{"line_number":96,"context_line":"        self._db_delete(context,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3Cw%3D","line":93,"updated":"2013-07-10 09:19:17.000000000","message":"Why only one,  there can be many qos policies for same network","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._db_delete(context,"},{"line_number":91,"context_line":"                        self._model_query(context,"},{"line_number":92,"context_line":"                                          NetworkQoSMapping)"},{"line_number":93,"context_line":"                        .filter(NetworkQoSMapping.network \u003d\u003d id).one())"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def delete_qos_for_port(self, context, id):"},{"line_number":96,"context_line":"        self._db_delete(context,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fo0A%3D","line":93,"in_reply_to":"AAAAP3%2F%2F3Cw%3D","updated":"2013-07-15 15:03:58.000000000","message":"If you wish to have different qos policies on the same network, you will need to do it on a per-port basis. Unless you are referring to having two different QoS types, on the same network. For example, having both a DSCP mark and a rate limit. I can certainly appreciate the use case, but I don\u0027t have plans to try and tackle that complexity at this point.","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def delete_qos_for_port(self, context, id):"},{"line_number":96,"context_line":"        self._db_delete(context,"},{"line_number":97,"context_line":"                        self._model_query(context, PortQoSMapping)"},{"line_number":98,"context_line":"                        .filter(PortQoSMapping.port \u003d\u003d id).one())"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def get_mapping_for_network(self, context, id):"},{"line_number":101,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3Cs%3D","line":98,"updated":"2013-07-10 09:19:17.000000000","message":"Again here, one only one policy?","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"}],"quantum/extensions/qos.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":13,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":14,"context_line":"               \u0027is_visible\u0027: True,"},{"line_number":15,"context_line":"               \u0027primary_key\u0027: True},"},{"line_number":16,"context_line":"        \u0027policy\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":17,"context_line":"                   \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":18,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":19,"context_line":"                      \u0027required_by_policy\u0027: True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2Fb18%3D","line":16,"updated":"2013-06-04 01:21:12.000000000","message":"I don\u0027t really like that there is no validation done here and policy can be anything. I personally think this should try to be more like how the nvp-qos extension works or security groups/fwaas.\n\nWhy is allow_put \u003d false?","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":13,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":14,"context_line":"               \u0027is_visible\u0027: True,"},{"line_number":15,"context_line":"               \u0027primary_key\u0027: True},"},{"line_number":16,"context_line":"        \u0027policy\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":17,"context_line":"                   \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":18,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":19,"context_line":"                      \u0027required_by_policy\u0027: True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F%2FIk%3D","line":16,"in_reply_to":"AAAAPH%2F%2Fb18%3D","updated":"2013-06-04 14:29:57.000000000","message":"allow_put \u003d false is an error on my part.\n\nI plan on creating a hook for a plugin to validate the policy, during submission. Just haven\u0027t gotten around to that part yet. :)","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":28,"context_line":"                    \u0027allow_put\u0027: True,"},{"line_number":29,"context_line":"                    \u0027is_visible\u0027: True,"},{"line_number":30,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"},{"line_number":31,"context_line":"    \u0027subnets\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":32,"context_line":"                      \u0027allow_put\u0027: True,"},{"line_number":33,"context_line":"                      \u0027is_visible\u0027: True,"},{"line_number":34,"context_line":"                      \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2Fb2A%3D","line":31,"updated":"2013-06-04 01:21:12.000000000","message":"I wonder if we actually want this on subnets too. Imo just networks and ports as ips are allocated by default out of networks until the first subnet pool is empty .","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                    \u0027allow_put\u0027: True,"},{"line_number":29,"context_line":"                    \u0027is_visible\u0027: True,"},{"line_number":30,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"},{"line_number":31,"context_line":"    \u0027subnets\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":32,"context_line":"                      \u0027allow_put\u0027: True,"},{"line_number":33,"context_line":"                      \u0027is_visible\u0027: True,"},{"line_number":34,"context_line":"                      \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F%2FIU%3D","line":31,"in_reply_to":"AAAAPH%2F%2Fb2A%3D","updated":"2013-06-04 14:29:57.000000000","message":"I could be wrong, but the downside of just having networks and ports is you have either a really big hammer (network) to apply a QoS policy, or you have to go port by port and apply a QoS policy.\n\nIdeally, we\u0027d like to support the use case of giving a specific subnet a QoS policy, so that it can cover all the VMs that a tenant has, without having to go port by port, but also without having any side-effects to other tenants, without having to resort to creating a dedicated network for that tenant.\n\nThat was my thought process at least.","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":28,"context_line":"                    \u0027allow_put\u0027: True,"},{"line_number":29,"context_line":"                    \u0027is_visible\u0027: True,"},{"line_number":30,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"},{"line_number":31,"context_line":"    \u0027subnets\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":32,"context_line":"                      \u0027allow_put\u0027: True,"},{"line_number":33,"context_line":"                      \u0027is_visible\u0027: True,"},{"line_number":34,"context_line":"                      \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F9z8%3D","line":31,"in_reply_to":"AAAAPX%2F%2F%2FIU%3D","updated":"2013-06-05 00:11:36.000000000","message":"I hear what your saying but I think this should still be abstracted to ports and networks. I don\u0027t really see a big use case for one wanting to do this on subnets.","commit_id":"3dcbcc6e5d377417e4b860362ce283e9ed97b230"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":14,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":15,"context_line":"               \u0027is_visible\u0027: True,"},{"line_number":16,"context_line":"               \u0027primary_key\u0027: True},"},{"line_number":17,"context_line":"        \u0027policy\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":18,"context_line":"                   \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":19,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":20,"context_line":"                      \u0027required_by_policy\u0027: True,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2Foho%3D","line":17,"updated":"2013-06-13 20:47:32.000000000","message":"What is policy supposed to look like? We should be doing validation here for it.","commit_id":"430fe6814f931ca0789e502d7113702eddc4481d"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":14,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":15,"context_line":"               \u0027is_visible\u0027: True,"},{"line_number":16,"context_line":"               \u0027primary_key\u0027: True},"},{"line_number":17,"context_line":"        \u0027policy\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":18,"context_line":"                   \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":19,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":20,"context_line":"                      \u0027required_by_policy\u0027: True,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPn%2F%2F9pE%3D","line":17,"in_reply_to":"AAAAPX%2F%2Foho%3D","updated":"2013-06-17 10:22:32.000000000","message":"Agreed - Sorry, I missed _validate_dict in the quantum.api.v2.attributes module - I\u0027ll use that.","commit_id":"430fe6814f931ca0789e502d7113702eddc4481d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":30,"context_line":"    \u0027qoss\u0027: {"},{"line_number":31,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":33,"context_line":"               \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Fmyo%3D","line":30,"updated":"2013-06-26 21:08:34.000000000","message":"small grammar nit, why the extra s? If totally necessary, wouldn\u0027t it be better to follow what the other folks did by using the label and post-fix the s? You got the label down below already.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":30,"context_line":"    \u0027qoss\u0027: {"},{"line_number":31,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":33,"context_line":"               \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Fj7o%3D","line":30,"in_reply_to":"AAAAPn%2F%2Fmyo%3D","updated":"2013-06-27 18:53:27.000000000","message":"I\u0027ll have to look into it. I originally had it as \"qos\" but had difficulty getting everything (attribute map, extension descriptor) to wire up correctly. Adding the extra \"s\" made it \"work\" so I figured it would at least get me to the point where I could write my unit tests, until someone more familiar with Quantum\u0027s WSGI/Extensions architecture could point me in the right direction.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":33,"context_line":"               \u0027is_visible\u0027: True,"},{"line_number":34,"context_line":"               \u0027primary_key\u0027: True},"},{"line_number":35,"context_line":"        \u0027policy\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":36,"context_line":"                   \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":37,"context_line":"                   \u0027validate\u0027: {\u0027type:dict\u0027: None}},"},{"line_number":38,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Ff58%3D","line":35,"updated":"2013-06-29 06:14:34.000000000","message":"These fields need to be validated via the api like all the rest of the extensions. Also I\u0027m still having a hard time seeing what this api  looks like. Why not remove policy and just fold those fields into here?","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":33,"context_line":"               \u0027is_visible\u0027: True,"},{"line_number":34,"context_line":"               \u0027primary_key\u0027: True},"},{"line_number":35,"context_line":"        \u0027policy\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":36,"context_line":"                   \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":37,"context_line":"                   \u0027validate\u0027: {\u0027type:dict\u0027: None}},"},{"line_number":38,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2FcW0%3D","line":35,"in_reply_to":"AAAAPn%2F%2Fceo%3D","updated":"2013-07-01 20:43:52.000000000","message":"You should add it here like this: https://github.com/openstack/quantum/blob/master/quantum/extensions/securitygroup.py#L154","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":32,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":33,"context_line":"               \u0027is_visible\u0027: True,"},{"line_number":34,"context_line":"               \u0027primary_key\u0027: True},"},{"line_number":35,"context_line":"        \u0027policy\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":36,"context_line":"                   \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027,"},{"line_number":37,"context_line":"                   \u0027validate\u0027: {\u0027type:dict\u0027: None}},"},{"line_number":38,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Fceo%3D","line":35,"in_reply_to":"AAAAPn%2F%2Ff58%3D","updated":"2013-07-01 20:33:22.000000000","message":"Hi,\n\nI have a validate_qos method that is defined in the QoSPluginBase, that is called over in the QoSDbMixin just before storage in the database. Should I leave it there, or should I define a new validation routine over in the quantum.api.v2.attributes module so it can replace the validation done on line 37?","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"                    \u0027allow_put\u0027: True,"},{"line_number":49,"context_line":"                    \u0027is_visible\u0027: True,"},{"line_number":50,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"},{"line_number":51,"context_line":"    \u0027subnets\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":52,"context_line":"                      \u0027allow_put\u0027: True,"},{"line_number":53,"context_line":"                      \u0027is_visible\u0027: True,"},{"line_number":54,"context_line":"                      \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Ff54%3D","line":51,"updated":"2013-06-29 06:14:34.000000000","message":"i guess del later per your comments.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"class InvalidQos(qexception.InvalidInput):"},{"line_number":63,"context_line":"    message \u003d _(\"Invalid QoS Policy\")"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Ff5g%3D","line":62,"updated":"2013-06-29 06:14:34.000000000","message":"nit: QoS. Would be better to name this something more than just InvalidQoS\u003csomething\u003e","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":59,"context_line":"}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"class InvalidQos(qexception.InvalidInput):"},{"line_number":63,"context_line":"    message \u003d _(\"Invalid QoS Policy\")"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2FcfM%3D","line":62,"in_reply_to":"AAAAPn%2F%2Ff5g%3D","updated":"2013-07-01 20:33:22.000000000","message":"Done","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":53,"context_line":"    \u0027ports\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":54,"context_line":"                    \u0027allow_put\u0027: True,"},{"line_number":55,"context_line":"                    \u0027is_visible\u0027: True,"},{"line_number":56,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"},{"line_number":57,"context_line":"    \u0027networks\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":58,"context_line":"                       \u0027allow_put\u0027: True,"},{"line_number":59,"context_line":"                       \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3BQ%3D","line":56,"updated":"2013-07-10 09:19:17.000000000","message":"what type is expected here. Is it list or dict?","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    \u0027ports\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":54,"context_line":"                    \u0027allow_put\u0027: True,"},{"line_number":55,"context_line":"                    \u0027is_visible\u0027: True,"},{"line_number":56,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"},{"line_number":57,"context_line":"    \u0027networks\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":58,"context_line":"                       \u0027allow_put\u0027: True,"},{"line_number":59,"context_line":"                       \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fozg%3D","line":56,"in_reply_to":"AAAAP3%2F%2F3BQ%3D","updated":"2013-07-15 15:03:58.000000000","message":"It should be a UUID pointing back to the qos object. Will update to fix.","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"    \u0027networks\u0027: {QOS: {\u0027allow_post\u0027: True,"},{"line_number":58,"context_line":"                       \u0027allow_put\u0027: True,"},{"line_number":59,"context_line":"                       \u0027is_visible\u0027: True,"},{"line_number":60,"context_line":"                       \u0027default\u0027: attr.ATTR_NOT_SPECIFIED}},"},{"line_number":61,"context_line":"}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3BM%3D","line":60,"updated":"2013-07-10 09:19:17.000000000","message":"ditto","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":136,"context_line":"        pass"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    @abstractmethod"},{"line_number":139,"context_line":"    def delete_qos_for_network(self, context, id):"},{"line_number":140,"context_line":"        pass"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3Ac%3D","line":139,"updated":"2013-07-10 09:19:17.000000000","message":"please rename id to network_id. Its confusing as options are qos_id or network_id.","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        pass"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    @abstractmethod"},{"line_number":139,"context_line":"    def delete_qos_for_network(self, context, id):"},{"line_number":140,"context_line":"        pass"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fozc%3D","line":139,"in_reply_to":"AAAAP3%2F%2F3Ac%3D","updated":"2013-07-15 15:03:58.000000000","message":"Done","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":140,"context_line":"        pass"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @abstractmethod"},{"line_number":143,"context_line":"    def create_qos_for_port(self, context, qos_id, port_id):"},{"line_number":144,"context_line":"        pass"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3AM%3D","line":143,"updated":"2013-07-10 09:19:17.000000000","message":"same as for create_qos_for_network","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        pass"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @abstractmethod"},{"line_number":143,"context_line":"    def create_qos_for_port(self, context, qos_id, port_id):"},{"line_number":144,"context_line":"        pass"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FozY%3D","line":143,"in_reply_to":"AAAAP3%2F%2F3AM%3D","updated":"2013-07-15 15:03:58.000000000","message":"Done","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"unresolved":false,"context_lines":[{"line_number":144,"context_line":"        pass"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    @abstractmethod"},{"line_number":147,"context_line":"    def delete_qos_for_port(self, context, id):"},{"line_number":148,"context_line":"        pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2F3A4%3D","line":147,"updated":"2013-07-10 09:19:17.000000000","message":"please rename id to port_id. Its confusing since can be either qos_id or port_id","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        pass"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    @abstractmethod"},{"line_number":147,"context_line":"    def delete_qos_for_port(self, context, id):"},{"line_number":148,"context_line":"        pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FozQ%3D","line":147,"in_reply_to":"AAAAP3%2F%2F3A4%3D","updated":"2013-07-15 15:03:58.000000000","message":"Done","commit_id":"9d3926ca9d61c969e3c81fee9430aa5019cc6aee"}],"quantum/plugins/cisco/db/network_models_v2.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":106,"context_line":"class QoS(model_base.BASEV2, L2NetworkBase):"},{"line_number":107,"context_line":"    \"\"\"Represents QoS for a tenant.\"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    __tablename__ \u003d \u0027cisco_qoss\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    qos_id \u003d Column(String(255))"},{"line_number":112,"context_line":"    tenant_id \u003d Column(String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Ff5w%3D","line":109,"updated":"2013-06-29 06:14:34.000000000","message":"We shoudn\u0027t rename this. If they use qoss that\u0027s fine as long as they are not also using your base class which they are not  yet.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":106,"context_line":"class QoS(model_base.BASEV2, L2NetworkBase):"},{"line_number":107,"context_line":"    \"\"\"Represents QoS for a tenant.\"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    __tablename__ \u003d \u0027cisco_qoss\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    qos_id \u003d Column(String(255))"},{"line_number":112,"context_line":"    tenant_id \u003d Column(String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2FcWE%3D","line":109,"in_reply_to":"AAAAPn%2F%2FcfE%3D","updated":"2013-07-01 20:43:52.000000000","message":"I see interesting.  This looks like a bug we have in the db or unit test code how things are loaded.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"448a596199b85b80ebc9637105e5d0724f4e9287","unresolved":false,"context_lines":[{"line_number":106,"context_line":"class QoS(model_base.BASEV2, L2NetworkBase):"},{"line_number":107,"context_line":"    \"\"\"Represents QoS for a tenant.\"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    __tablename__ \u003d \u0027cisco_qoss\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    qos_id \u003d Column(String(255))"},{"line_number":112,"context_line":"    tenant_id \u003d Column(String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2FcfE%3D","line":109,"in_reply_to":"AAAAPn%2F%2Ff5w%3D","updated":"2013-07-01 20:33:22.000000000","message":"I had to rename the table, because either their DB definition gets loaded up first, or mine does, and either their test suite fails or mine does, because the schemas are different.\n\nhttp://paste.openstack.org/show/39430/\n\nI asked in an earlier patch set for suggestions, if I should do the extend_existing\u003dtrue or just rename the table, and I didn\u0027t get any response. Please let me know if there is a better way.","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"}],"quantum/tests/unit/test_extension_qos.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":92,"context_line":"        return quantum_networks"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def get_ports(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":95,"context_line":"                  sorts\u003d[], limit\u003dNone, marker\u003dNone,"},{"line_number":96,"context_line":"                  page_reverse\u003dFalse):"},{"line_number":97,"context_line":"        quantum_lports \u003d super(QoSTestPlugin, self).get_ports("},{"line_number":98,"context_line":"            context, filters, sorts\u003dsorts, limit\u003dlimit, marker\u003dmarker,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Ff5o%3D","line":95,"updated":"2013-06-29 06:14:34.000000000","message":"sorts\u003dNone not []","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return quantum_lports"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def get_subnets(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":108,"context_line":"                    sorts\u003d[], limit\u003dNone, marker\u003dNone,"},{"line_number":109,"context_line":"                    page_reverse\u003dFalse):"},{"line_number":110,"context_line":"        quantum_subnets \u003d super(QoSTestPlugin, self).get_subnets("},{"line_number":111,"context_line":"            context, filters, sorts\u003dsorts, limit\u003dlimit, marker\u003dmarker,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPn%2F%2Ff5k%3D","line":108,"updated":"2013-06-29 06:14:34.000000000","message":"ditto","commit_id":"919257bdbd48af7d3cbc7d4e4ba82311a5e4a07c"}]}
