)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"d73e12ab990d50ed505a61afa7bba873fb8b058f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     7d48bde7 (Merge \"Add \"Port\" to \"RouterPort\" foreign_keys\")"},{"line_number":2,"context_line":"Author:     David Shaughnessy \u003cdavid.shaughnessy@intel.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2019-07-08 16:12:46 +0000"},{"line_number":4,"context_line":"Commit:     David Shaughnessy \u003cdavid.shaughnessy@intel.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5faad753_2631a20c","line":1,"updated":"2019-09-09 16:31:15.000000000","message":"The main changes are in the db models and oslo versioned objects, there is still some refactor work required in the advertiser and service plugin to accommodate the change in the relationship of the models.\nI\u0027d disregard any changes outside of the DB and objects folders for this reason and focus the discussions on how to correctly model the resources.","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"}],"neutron/agent/l3/l3_agent_extension_api.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"777fd298edd483d9427ce81558d04fa84204685d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron.services.classification import agent_extension_api_mixin as c_api"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class L3AgentExtensionAPI(c_api.APIClassificationMixin):"},{"line_number":21,"context_line":"    \u0027\u0027\u0027Implements the Agent API for the L3 agent."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    Extensions can gain access to this API by overriding the consume_api"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_00d085f3","line":20,"range":{"start_line":20,"start_character":26,"end_line":20,"end_character":54},"updated":"2020-01-07 12:27:11.000000000","message":"Could you explain why is this necessary?","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7abba06e3916e8dcb6c16b66d525ada704a4eb48","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron.services.classification import agent_extension_api_mixin as c_api"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class L3AgentExtensionAPI(c_api.APIClassificationMixin):"},{"line_number":21,"context_line":"    \u0027\u0027\u0027Implements the Agent API for the L3 agent."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    Extensions can gain access to this API by overriding the consume_api"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_d5117bfa","line":20,"range":{"start_line":20,"start_character":26,"end_line":20,"end_character":54},"in_reply_to":"3fa7e38b_00d085f3","updated":"2020-01-17 10:59:14.000000000","message":"Since most extensions already use the agent extensions API for communicating with the Agents, integrating the functions to retrieve the classifications seemed like the best way to expose it.\nOtherwise each individual extension would need to make the calls to the service plugin to get the definition of the classifications.","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"}],"neutron/db/classification/models.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class ClassificationGroup(model_base.BASEV2, model_base.HasId,"},{"line_number":25,"context_line":"                          model_base.HasProject):"},{"line_number":26,"context_line":"    __tablename__ \u003d \u0027classification_groups\u0027"},{"line_number":27,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":28,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":29,"context_line":"    shared \u003d sa.Column(sa.Boolean, default\u003dFalse)"},{"line_number":30,"context_line":"    operator \u003d sa.Column(sa.Enum(\u0027AND\u0027, \u0027OR\u0027), default\u003d\u0027AND\u0027, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_e5b810c9","line":27,"range":{"start_line":27,"start_character":31,"end_line":27,"end_character":34},"updated":"2019-07-30 15:04:49.000000000","message":"db_const.NAME_FIELD_SIZE","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class ClassificationGroup(model_base.BASEV2, model_base.HasId,"},{"line_number":25,"context_line":"                          model_base.HasProject):"},{"line_number":26,"context_line":"    __tablename__ \u003d \u0027classification_groups\u0027"},{"line_number":27,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":28,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":29,"context_line":"    shared \u003d sa.Column(sa.Boolean, default\u003dFalse)"},{"line_number":30,"context_line":"    operator \u003d sa.Column(sa.Enum(\u0027AND\u0027, \u0027OR\u0027), default\u003d\u0027AND\u0027, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_e9a266ad","line":27,"range":{"start_line":27,"start_character":31,"end_line":27,"end_character":34},"in_reply_to":"7faddb67_e5b810c9","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                          model_base.HasProject):"},{"line_number":26,"context_line":"    __tablename__ \u003d \u0027classification_groups\u0027"},{"line_number":27,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":28,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":29,"context_line":"    shared \u003d sa.Column(sa.Boolean, default\u003dFalse)"},{"line_number":30,"context_line":"    operator \u003d sa.Column(sa.Enum(\u0027AND\u0027, \u0027OR\u0027), default\u003d\u0027AND\u0027, nullable\u003dFalse)"},{"line_number":31,"context_line":"    classifications \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_65fae075","line":28,"range":{"start_line":28,"start_character":38,"end_line":28,"end_character":41},"updated":"2019-07-30 15:04:49.000000000","message":"db_const.DESCRIPTION_FIELD_SIZE","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                          model_base.HasProject):"},{"line_number":26,"context_line":"    __tablename__ \u003d \u0027classification_groups\u0027"},{"line_number":27,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":28,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":29,"context_line":"    shared \u003d sa.Column(sa.Boolean, default\u003dFalse)"},{"line_number":30,"context_line":"    operator \u003d sa.Column(sa.Enum(\u0027AND\u0027, \u0027OR\u0027), default\u003d\u0027AND\u0027, nullable\u003dFalse)"},{"line_number":31,"context_line":"    classifications \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_89a97291","line":28,"range":{"start_line":28,"start_character":38,"end_line":28,"end_character":41},"in_reply_to":"7faddb67_65fae075","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        primaryjoin\u003d\"ClassificationGroup.id\u003d\u003d\""},{"line_number":38,"context_line":"                    \"CGToClassificationGroupMapping.container_cg_id\","},{"line_number":39,"context_line":"        secondaryjoin\u003d\"ClassificationGroup.id\u003d\u003d\""},{"line_number":40,"context_line":"                      \"CGToClassificationGroupMapping.stored_cg_id\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ClassificationGroupRBAC(rbac_db_models.RBACColumns, model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_504e8438","line":40,"updated":"2019-07-30 15:04:49.000000000","message":"nit: today I\u0027ll need some info about how classificationgroup, CGToClassificationGroupMapping and CGToClassificationGroupMapping work together.","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        primaryjoin\u003d\"ClassificationGroup.id\u003d\u003d\""},{"line_number":38,"context_line":"                    \"CGToClassificationGroupMapping.container_cg_id\","},{"line_number":39,"context_line":"        secondaryjoin\u003d\"ClassificationGroup.id\u003d\u003d\""},{"line_number":40,"context_line":"                      \"CGToClassificationGroupMapping.stored_cg_id\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ClassificationGroupRBAC(rbac_db_models.RBACColumns, model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_e5712279","line":40,"in_reply_to":"7faddb67_504e8438","updated":"2019-08-12 16:33:16.000000000","message":"I think I\u0027ve addressed this in the meeting, but I\u0027ll link to the spec which sets out the data model we went with for the DB:\nhttps://specs.openstack.org/openstack/neutron-specs/specs/pike/common-classification-framework.html#data-model-impact","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                      \"CGToClassificationGroupMapping.stored_cg_id\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ClassificationGroupRBAC(rbac_db_models.RBACColumns, model_base.BASEV2):"},{"line_number":44,"context_line":"    \"\"\"RBAC table for classification groups.\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    object_id \u003d rbac_db_models._object_id_column(\u0027classification_groups.id\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_100b2cd6","line":43,"updated":"2019-07-30 15:04:49.000000000","message":"IMO, you should move this to db.rbac_db_models","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ClassificationGroupRBAC(rbac_db_models.RBACColumns, model_base.BASEV2):"},{"line_number":44,"context_line":"    \"\"\"RBAC table for classification groups.\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    object_id \u003d rbac_db_models._object_id_column(\u0027classification_groups.id\u0027)"},{"line_number":47,"context_line":"    object_type \u003d \u0027classification_group\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_d0103403","line":44,"updated":"2019-07-30 15:04:49.000000000","message":"Where are you using it??","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    object_type \u003d \u0027classification_group\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_valid_actions(self):"},{"line_number":50,"context_line":"        return (rbac_db_models.ACCESS_SHARED)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class CGToClassificationMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_65a3c09f","line":50,"range":{"start_line":50,"start_character":15,"end_line":50,"end_character":45},"updated":"2019-07-30 15:04:49.000000000","message":"This should return a tuple:\n  return (rbac_db_models.ACCESS_SHARED, )","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    object_type \u003d \u0027classification_group\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_valid_actions(self):"},{"line_number":50,"context_line":"        return (rbac_db_models.ACCESS_SHARED)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class CGToClassificationMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_a9ac6e9f","line":50,"range":{"start_line":50,"start_character":15,"end_line":50,"end_character":45},"in_reply_to":"7faddb67_65a3c09f","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                             primary_key\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class ClassificationBase(model_base.HasId, model_base.HasProject,"},{"line_number":75,"context_line":"                         model_base.BASEV2):"},{"line_number":76,"context_line":"    __tablename__ \u003d \u0027classifications\u0027"},{"line_number":77,"context_line":"    c_type \u003d sa.Column(sa.String(36))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_d0a6f40f","line":74,"range":{"start_line":74,"start_character":36,"end_line":74,"end_character":41},"updated":"2019-07-30 15:04:49.000000000","message":"If \"id\" is going to be something different in each child class, remove this inheritance.","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                             primary_key\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class ClassificationBase(model_base.HasId, model_base.HasProject,"},{"line_number":75,"context_line":"                         model_base.BASEV2):"},{"line_number":76,"context_line":"    __tablename__ \u003d \u0027classifications\u0027"},{"line_number":77,"context_line":"    c_type \u003d sa.Column(sa.String(36))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_90671cea","line":74,"updated":"2019-07-30 15:04:49.000000000","message":"Why we need this table? This is not a classification type itself. If this is just an abs class for the other types, you should remove model_base.BASEV2.","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    __tablename__ \u003d \u0027classifications\u0027"},{"line_number":77,"context_line":"    c_type \u003d sa.Column(sa.String(36))"},{"line_number":78,"context_line":"    __mapper_args__ \u003d {\u0027polymorphic_on\u0027: c_type}"},{"line_number":79,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":80,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":81,"context_line":"    shared \u003d sa.Column(sa.Boolean())"},{"line_number":82,"context_line":"    negated \u003d sa.Column(sa.Boolean())"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_85227cb8","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":34},"updated":"2019-07-30 15:04:49.000000000","message":"ditto","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    __tablename__ \u003d \u0027classifications\u0027"},{"line_number":77,"context_line":"    c_type \u003d sa.Column(sa.String(36))"},{"line_number":78,"context_line":"    __mapper_args__ \u003d {\u0027polymorphic_on\u0027: c_type}"},{"line_number":79,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":80,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":81,"context_line":"    shared \u003d sa.Column(sa.Boolean())"},{"line_number":82,"context_line":"    negated \u003d sa.Column(sa.Boolean())"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_05c55e3d","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":34},"in_reply_to":"7faddb67_85227cb8","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    c_type \u003d sa.Column(sa.String(36))"},{"line_number":78,"context_line":"    __mapper_args__ \u003d {\u0027polymorphic_on\u0027: c_type}"},{"line_number":79,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":80,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":81,"context_line":"    shared \u003d sa.Column(sa.Boolean())"},{"line_number":82,"context_line":"    negated \u003d sa.Column(sa.Boolean())"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_45280496","line":80,"range":{"start_line":80,"start_character":38,"end_line":80,"end_character":41},"updated":"2019-07-30 15:04:49.000000000","message":"ditto","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    c_type \u003d sa.Column(sa.String(36))"},{"line_number":78,"context_line":"    __mapper_args__ \u003d {\u0027polymorphic_on\u0027: c_type}"},{"line_number":79,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":80,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":81,"context_line":"    shared \u003d sa.Column(sa.Boolean())"},{"line_number":82,"context_line":"    negated \u003d sa.Column(sa.Boolean())"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_a5c32a38","line":80,"range":{"start_line":80,"start_character":38,"end_line":80,"end_character":41},"in_reply_to":"7faddb67_45280496","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"class IPV4Classification(ClassificationBase):"},{"line_number":86,"context_line":"    __tablename__ \u003d \u0027ipv4_classifications\u0027"},{"line_number":87,"context_line":"    __mapper_args__ \u003d {\u0027polymorphic_identity\u0027: \u0027ipv4\u0027}"},{"line_number":88,"context_line":"    id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":89,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":90,"context_line":"    dscp \u003d sa.Column(sa.Integer())"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_10efac1e","line":87,"range":{"start_line":87,"start_character":4,"end_line":87,"end_character":54},"updated":"2019-07-30 15:04:49.000000000","message":"Why do you need this? You can do something like in the QoS rules: each classification can have a \"classification_id\" as a foreign key.","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":85,"context_line":"class IPV4Classification(ClassificationBase):"},{"line_number":86,"context_line":"    __tablename__ \u003d \u0027ipv4_classifications\u0027"},{"line_number":87,"context_line":"    __mapper_args__ \u003d {\u0027polymorphic_identity\u0027: \u0027ipv4\u0027}"},{"line_number":88,"context_line":"    id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":89,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":90,"context_line":"    dscp \u003d sa.Column(sa.Integer())"},{"line_number":91,"context_line":"    dscp_mask \u003d sa.Column(sa.Integer())"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_d07fd463","line":88,"updated":"2019-07-30 15:04:49.000000000","message":"You should not redefine \"id\". Create a new field for this.","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":159,"context_line":"def _read_classification_group(context, id):"},{"line_number":160,"context_line":"    \"\"\"Returns a classification group.\"\"\""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    cg \u003d mq.get_by_id(context, ClassificationGroup, id)"},{"line_number":163,"context_line":"    return cg"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_70ddc06e","line":162,"range":{"start_line":162,"start_character":4,"end_line":162,"end_character":9},"updated":"2019-07-30 15:04:49.000000000","message":"return .... (one line)","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":159,"context_line":"def _read_classification_group(context, id):"},{"line_number":160,"context_line":"    \"\"\"Returns a classification group.\"\"\""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    cg \u003d mq.get_by_id(context, ClassificationGroup, id)"},{"line_number":163,"context_line":"    return cg"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_29987e73","line":162,"range":{"start_line":162,"start_character":4,"end_line":162,"end_character":9},"in_reply_to":"7faddb67_70ddc06e","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    \"\"\"Returns all the classifications mapped/related to a"},{"line_number":168,"context_line":"    classification group."},{"line_number":169,"context_line":"    \"\"\""},{"line_number":170,"context_line":"    class_group \u003d _read_classification_group(context, id)"},{"line_number":171,"context_line":"    return class_group.classifications"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_50e0c426","line":170,"updated":"2019-07-30 15:04:49.000000000","message":"ditto","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    \"\"\"Returns all the classifications mapped/related to a"},{"line_number":168,"context_line":"    classification group."},{"line_number":169,"context_line":"    \"\"\""},{"line_number":170,"context_line":"    class_group \u003d _read_classification_group(context, id)"},{"line_number":171,"context_line":"    return class_group.classifications"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_c988ca23","line":170,"in_reply_to":"7faddb67_50e0c426","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"def _generate_dict_from_cg_db(model, fields\u003dNone):"},{"line_number":183,"context_line":"    resp \u003d {}"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    resp[\u0027id\u0027] \u003d model.id"},{"line_number":186,"context_line":"    resp[\u0027name\u0027] \u003d model.name"},{"line_number":187,"context_line":"    resp[\u0027description\u0027] \u003d model.description"},{"line_number":188,"context_line":"    resp[\u0027project_id\u0027] \u003d model.project_id"},{"line_number":189,"context_line":"    resp[\u0027classifications\u0027] \u003d model.classifications"},{"line_number":190,"context_line":"    resp[\u0027classification_groups\u0027] \u003d model.classification_groups"},{"line_number":191,"context_line":"    resp[\u0027shared\u0027] \u003d model.shared"},{"line_number":192,"context_line":"    resp[\u0027operator\u0027] \u003d model.operator"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    return resp"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_d0cd94b7","line":192,"range":{"start_line":183,"start_character":5,"end_line":192,"end_character":37},"updated":"2019-07-30 15:04:49.000000000","message":"Can you do this in one single assignation?\n\nreturn {\u0027id: ...,    }","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"def _generate_dict_from_cg_db(model, fields\u003dNone):"},{"line_number":183,"context_line":"    resp \u003d {}"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    resp[\u0027id\u0027] \u003d model.id"},{"line_number":186,"context_line":"    resp[\u0027name\u0027] \u003d model.name"},{"line_number":187,"context_line":"    resp[\u0027description\u0027] \u003d model.description"},{"line_number":188,"context_line":"    resp[\u0027project_id\u0027] \u003d model.project_id"},{"line_number":189,"context_line":"    resp[\u0027classifications\u0027] \u003d model.classifications"},{"line_number":190,"context_line":"    resp[\u0027classification_groups\u0027] \u003d model.classification_groups"},{"line_number":191,"context_line":"    resp[\u0027shared\u0027] \u003d model.shared"},{"line_number":192,"context_line":"    resp[\u0027operator\u0027] \u003d model.operator"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    return resp"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_8982d2ff","line":192,"range":{"start_line":183,"start_character":5,"end_line":192,"end_character":37},"in_reply_to":"7faddb67_d0cd94b7","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    return class_group"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"RESOURCE_MODELS \u003d {\u0027ethernet_classification\u0027: EthernetClassification,"},{"line_number":206,"context_line":"                   \u0027ipv4_classification\u0027: IPV4Classification,"},{"line_number":207,"context_line":"                   \u0027ipv6_classification\u0027: IPV6Classification,"},{"line_number":208,"context_line":"                   \u0027tcp_classification\u0027: TCPClassification,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_f03770af","line":205,"range":{"start_line":205,"start_character":0,"end_line":205,"end_character":15},"updated":"2019-07-30 15:04:49.000000000","message":"IMO, this should not be here but in the OVO definition.","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    return class_group"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"RESOURCE_MODELS \u003d {\u0027ethernet_classification\u0027: EthernetClassification,"},{"line_number":206,"context_line":"                   \u0027ipv4_classification\u0027: IPV4Classification,"},{"line_number":207,"context_line":"                   \u0027ipv6_classification\u0027: IPV6Classification,"},{"line_number":208,"context_line":"                   \u0027tcp_classification\u0027: TCPClassification,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_298cfed5","line":205,"range":{"start_line":205,"start_character":0,"end_line":205,"end_character":15},"in_reply_to":"7faddb67_f03770af","updated":"2019-08-12 16:33:16.000000000","message":"I don\u0027t have a problem moving it, I\u0027m just wondering why it should be moved?","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    __tablename__ \u003d \u0027classification_groups\u0027"},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":29,"context_line":"    description \u003d sa.Column(sa.String(db_const.DESCRIPTION_FIELD_SIZE))"},{"line_number":30,"context_line":"    shared \u003d sa.Column(sa.Boolean, default\u003dFalse)"},{"line_number":31,"context_line":"    operator \u003d sa.Column(sa.Enum(\u0027AND\u0027, \u0027OR\u0027), default\u003d\u0027AND\u0027, nullable\u003dFalse)"},{"line_number":32,"context_line":"    classifications \u003d orm.relationship("},{"line_number":33,"context_line":"        \"Classification\", lazy\u003d\"subquery\","}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_9e07631d","line":30,"updated":"2019-09-10 16:47:48.000000000","message":"nullable False??","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    __tablename__ \u003d \u0027classification_groups\u0027"},{"line_number":28,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":29,"context_line":"    description \u003d sa.Column(sa.String(db_const.DESCRIPTION_FIELD_SIZE))"},{"line_number":30,"context_line":"    shared \u003d sa.Column(sa.Boolean, default\u003dFalse)"},{"line_number":31,"context_line":"    operator \u003d sa.Column(sa.Enum(\u0027AND\u0027, \u0027OR\u0027), default\u003d\u0027AND\u0027, nullable\u003dFalse)"},{"line_number":32,"context_line":"    classifications \u003d orm.relationship("},{"line_number":33,"context_line":"        \"Classification\", lazy\u003d\"subquery\","}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_0c289094","line":30,"in_reply_to":"5faad753_9e07631d","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                      \"CGToClassificationGroupMapping.stored_cg_id\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class ClassificationGroupRBAC(rbac_db_models.RBACColumns, model_base.BASEV2):"},{"line_number":45,"context_line":"    \"\"\"RBAC table for classification groups.\"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    object_id \u003d rbac_db_models._object_id_column(\u0027classification_groups.id\u0027)"},{"line_number":48,"context_line":"    object_type \u003d \u0027classification_group\u0027"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_valid_actions(self):"},{"line_number":51,"context_line":"        return (rbac_db_models.ACCESS_SHARED, )"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class CGToClassificationMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_2aa86e75","line":51,"range":{"start_line":44,"start_character":0,"end_line":51,"end_character":47},"updated":"2019-09-10 16:47:48.000000000","message":"Usually, the RBAC models are in db.rbac_db_models","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                      \"CGToClassificationGroupMapping.stored_cg_id\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class ClassificationGroupRBAC(rbac_db_models.RBACColumns, model_base.BASEV2):"},{"line_number":45,"context_line":"    \"\"\"RBAC table for classification groups.\"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    object_id \u003d rbac_db_models._object_id_column(\u0027classification_groups.id\u0027)"},{"line_number":48,"context_line":"    object_type \u003d \u0027classification_group\u0027"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_valid_actions(self):"},{"line_number":51,"context_line":"        return (rbac_db_models.ACCESS_SHARED, )"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class CGToClassificationMapping(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_ec2c14ad","line":51,"range":{"start_line":44,"start_character":0,"end_line":51,"end_character":47},"in_reply_to":"5faad753_2aa86e75","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    __tablename__ \u003d \u0027classification_group_to_classification_mappings\u0027"},{"line_number":56,"context_line":"    container_cg_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":57,"context_line":"                                sa.ForeignKey(\u0027classification_groups.id\u0027,"},{"line_number":58,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":59,"context_line":"    classification \u003d orm.relationship(\"Classification\", lazy\u003d\"subquery\")"},{"line_number":60,"context_line":"    stored_classification_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":61,"context_line":"                                         sa.ForeignKey(\u0027classifications.id\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_fe83f7a7","line":58,"updated":"2019-09-10 16:47:48.000000000","message":"Shouldn\u0027t be container_cg_id0stored_classification_id unique?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    __tablename__ \u003d \u0027classification_group_to_classification_mappings\u0027"},{"line_number":56,"context_line":"    container_cg_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":57,"context_line":"                                sa.ForeignKey(\u0027classification_groups.id\u0027,"},{"line_number":58,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":59,"context_line":"    classification \u003d orm.relationship(\"Classification\", lazy\u003d\"subquery\")"},{"line_number":60,"context_line":"    stored_classification_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":61,"context_line":"                                         sa.ForeignKey(\u0027classifications.id\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_4c2208bb","line":58,"in_reply_to":"5faad753_fe83f7a7","updated":"2019-10-02 12:56:16.000000000","message":"No, Classifications can have a 1:* relationship with Classification groups, they\u0027re an independent resource from Classification groups, but should only be consumed as part of a group.","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    container_cg_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":57,"context_line":"                                sa.ForeignKey(\u0027classification_groups.id\u0027,"},{"line_number":58,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":59,"context_line":"    classification \u003d orm.relationship(\"Classification\", lazy\u003d\"subquery\")"},{"line_number":60,"context_line":"    stored_classification_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":61,"context_line":"                                         sa.ForeignKey(\u0027classifications.id\u0027),"},{"line_number":62,"context_line":"                                         primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_de039b41","line":59,"updated":"2019-09-10 16:47:48.000000000","message":"I don\u0027t understand this relationship. Where are you defining the relation between \"classification_group_to_classification_mappings\" and \"classifications\"?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    container_cg_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":57,"context_line":"                                sa.ForeignKey(\u0027classification_groups.id\u0027,"},{"line_number":58,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":59,"context_line":"    classification \u003d orm.relationship(\"Classification\", lazy\u003d\"subquery\")"},{"line_number":60,"context_line":"    stored_classification_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":61,"context_line":"                                         sa.ForeignKey(\u0027classifications.id\u0027),"},{"line_number":62,"context_line":"                                         primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_32c3628b","line":59,"in_reply_to":"5faad753_de039b41","updated":"2019-10-02 12:56:16.000000000","message":"Short answer is I\u0027ll remove it and find out.\nexpect a longer answer if I need to keep it!","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":70,"context_line":"    stored_cg_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":71,"context_line":"                             sa.ForeignKey(\u0027classification_groups.id\u0027),"},{"line_number":72,"context_line":"                             primary_key\u003dTrue)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"class Classification(model_base.HasId, model_base.HasProject,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_be8d7fd4","line":72,"updated":"2019-09-10 16:47:48.000000000","message":"Shouldn\u0027t be container_cg_id0stored_cg_id unique?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":70,"context_line":"    stored_cg_id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":71,"context_line":"                             sa.ForeignKey(\u0027classification_groups.id\u0027),"},{"line_number":72,"context_line":"                             primary_key\u003dTrue)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"class Classification(model_base.HasId, model_base.HasProject,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_72423a11","line":72,"in_reply_to":"5faad753_be8d7fd4","updated":"2019-10-02 12:56:16.000000000","message":"No, multiple classification groups can point to other classification groups.","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":75,"context_line":"class Classification(model_base.HasId, model_base.HasProject,"},{"line_number":76,"context_line":"                     model_base.BASEV2):"},{"line_number":77,"context_line":"    __tablename__ \u003d \u0027classifications\u0027"},{"line_number":78,"context_line":"    c_type \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":79,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":80,"context_line":"    description \u003d sa.Column(sa.String(db_const.DESCRIPTION_FIELD_SIZE))"},{"line_number":81,"context_line":"    shared \u003d sa.Column(sa.Boolean())"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_4144ac1b","line":78,"updated":"2019-09-10 16:47:48.000000000","message":"Shouldn\u0027t this be nullable\u003dFalse?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":75,"context_line":"class Classification(model_base.HasId, model_base.HasProject,"},{"line_number":76,"context_line":"                     model_base.BASEV2):"},{"line_number":77,"context_line":"    __tablename__ \u003d \u0027classifications\u0027"},{"line_number":78,"context_line":"    c_type \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":79,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":80,"context_line":"    description \u003d sa.Column(sa.String(db_const.DESCRIPTION_FIELD_SIZE))"},{"line_number":81,"context_line":"    shared \u003d sa.Column(sa.Boolean())"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_124d063d","line":78,"in_reply_to":"5faad753_4144ac1b","updated":"2019-10-02 12:56:16.000000000","message":"Yes, Done!","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"class IPV4Definition(model_base.BASEV2):"},{"line_number":86,"context_line":"    __tablename__ \u003d \u0027ipv4_definitions\u0027"},{"line_number":87,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":88,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":89,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_bea6df52","line":86,"updated":"2019-09-10 16:47:48.000000000","message":"I would use \"classification_\" prefix, to have everything grouped in the DB.","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"class IPV4Definition(model_base.BASEV2):"},{"line_number":86,"context_line":"    __tablename__ \u003d \u0027ipv4_definitions\u0027"},{"line_number":87,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":88,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":89,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_32cda284","line":86,"in_reply_to":"5faad753_bea6df52","updated":"2019-10-02 12:56:16.000000000","message":"It makes sense, but after the refactor I\u0027d like to keep these as definitions, referring to both of these objects as classifications in the code would complicate discussions about their relationship.","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    __tablename__ \u003d \u0027ipv4_definitions\u0027"},{"line_number":87,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":88,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":89,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":90,"context_line":"    dscp \u003d sa.Column(sa.Integer())"},{"line_number":91,"context_line":"    dscp_mask \u003d sa.Column(sa.Integer())"},{"line_number":92,"context_line":"    ecn \u003d sa.Column(sa.Enum(\"0\", \"1\", \"2\", \"3\", name\u003d\u0027ecn_types\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_fe71b7df","line":89,"updated":"2019-09-10 16:47:48.000000000","message":"Should not be unique?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    __tablename__ \u003d \u0027ipv4_definitions\u0027"},{"line_number":87,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":88,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":89,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":90,"context_line":"    dscp \u003d sa.Column(sa.Integer())"},{"line_number":91,"context_line":"    dscp_mask \u003d sa.Column(sa.Integer())"},{"line_number":92,"context_line":"    ecn \u003d sa.Column(sa.Enum(\"0\", \"1\", \"2\", \"3\", name\u003d\u0027ecn_types\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_d29c4e6b","line":89,"in_reply_to":"5faad753_fe71b7df","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class IPV6Definition(model_base.BASEV2):"},{"line_number":105,"context_line":"    __tablename__ \u003d \u0027ipv6_definitions\u0027"},{"line_number":106,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":107,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":108,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_1e6db303","line":105,"updated":"2019-09-10 16:47:48.000000000","message":"ditto and next table names.","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class IPV6Definition(model_base.BASEV2):"},{"line_number":105,"context_line":"    __tablename__ \u003d \u0027ipv6_definitions\u0027"},{"line_number":106,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":107,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":108,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_1297464a","line":105,"in_reply_to":"5faad753_1e6db303","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    __tablename__ \u003d \u0027ipv6_definitions\u0027"},{"line_number":106,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":107,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":108,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":109,"context_line":"    dscp \u003d sa.Column(sa.Integer())"},{"line_number":110,"context_line":"    dscp_mask \u003d sa.Column(sa.Integer())"},{"line_number":111,"context_line":"    ecn \u003d sa.Column(sa.Enum(\"0\", \"1\", \"2\", \"3\", name\u003d\u0027ecn_types\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_3e498f8a","line":108,"updated":"2019-09-10 16:47:48.000000000","message":"unique (and next \"id\")?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    __tablename__ \u003d \u0027ipv6_definitions\u0027"},{"line_number":106,"context_line":"    id \u003d sa.Column(sa.String(db_const.UUID_FIELD_SIZE),"},{"line_number":107,"context_line":"                   sa.ForeignKey(\u0027classifications.id\u0027,"},{"line_number":108,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":109,"context_line":"    dscp \u003d sa.Column(sa.Integer())"},{"line_number":110,"context_line":"    dscp_mask \u003d sa.Column(sa.Integer())"},{"line_number":111,"context_line":"    ecn \u003d sa.Column(sa.Enum(\"0\", \"1\", \"2\", \"3\", name\u003d\u0027ecn_types\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_32928258","line":108,"in_reply_to":"5faad753_3e498f8a","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":191,"context_line":"def _read_all_classification_groups(plugin, context):"},{"line_number":192,"context_line":"    \"\"\"Returns all classification groups.\"\"\""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    class_group \u003d plugin._get_collection(context, ClassificationGroup,"},{"line_number":195,"context_line":"                                         _generate_dict_from_cg_db)"},{"line_number":196,"context_line":"    return class_group"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_5e31eb0a","line":194,"updated":"2019-09-10 16:47:48.000000000","message":"return plugin._get_collection(......) (avoid creating \"class_group\" var)","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":191,"context_line":"def _read_all_classification_groups(plugin, context):"},{"line_number":192,"context_line":"    \"\"\"Returns all classification groups.\"\"\""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    class_group \u003d plugin._get_collection(context, ClassificationGroup,"},{"line_number":195,"context_line":"                                         _generate_dict_from_cg_db)"},{"line_number":196,"context_line":"    return class_group"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_0cde50d9","line":194,"in_reply_to":"5faad753_5e31eb0a","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"777fd298edd483d9427ce81558d04fa84204685d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.db import constants as db_const"},{"line_number":16,"context_line":"from neutron_lib.db import model_base"},{"line_number":17,"context_line":"from neutron_lib.db import model_query as mq"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ClassificationGroup(model_base.BASEV2, model_base.HasId,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_a01091ac","line":20,"range":{"start_line":15,"start_character":0,"end_line":20,"end_character":26},"updated":"2020-01-07 12:27:11.000000000","message":"nit: by this document: https://docs.openstack.org/hacking/latest/user/hacking.html#import-order-template\n\nsqlalchemy should be in a block at the beginning of imports","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7abba06e3916e8dcb6c16b66d525ada704a4eb48","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.db import constants as db_const"},{"line_number":16,"context_line":"from neutron_lib.db import model_base"},{"line_number":17,"context_line":"from neutron_lib.db import model_query as mq"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ClassificationGroup(model_base.BASEV2, model_base.HasId,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_35d6cf28","line":20,"range":{"start_line":15,"start_character":0,"end_line":20,"end_character":26},"in_reply_to":"3fa7e38b_a01091ac","updated":"2020-01-17 10:59:14.000000000","message":"Done","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"}],"neutron/db/migration/alembic_migrations/versions/train/expand/ae8df423b477_neutron_classifier.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    op.create_table("},{"line_number":46,"context_line":"        \u0027classificationgrouprbacs\u0027,"},{"line_number":47,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                  nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027project_id\u0027, sa.String(length\u003d255)),"},{"line_number":50,"context_line":"        sa.Column(\u0027target_tenant\u0027, sa.String(length\u003d255),"},{"line_number":51,"context_line":"                  nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_01c1d480","line":48,"updated":"2019-09-10 16:47:48.000000000","message":"if primary_key, then nullable defaults to False\n\nhttps://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/sql/schema.py#L1195-L1197","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    op.create_table("},{"line_number":46,"context_line":"        \u0027classificationgrouprbacs\u0027,"},{"line_number":47,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                  nullable\u003dFalse),"},{"line_number":49,"context_line":"        sa.Column(\u0027project_id\u0027, sa.String(length\u003d255)),"},{"line_number":50,"context_line":"        sa.Column(\u0027target_tenant\u0027, sa.String(length\u003d255),"},{"line_number":51,"context_line":"                  nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_b57bbc89","line":48,"in_reply_to":"5faad753_01c1d480","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        sa.ForeignKeyConstraint([\u0027object_id\u0027],"},{"line_number":56,"context_line":"                                [\u0027classification_groups.id\u0027],"},{"line_number":57,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":58,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":59,"context_line":"        sa.UniqueConstraint(\u0027target_tenant\u0027,"},{"line_number":60,"context_line":"                            \u0027object_id\u0027, \u0027action\u0027))"},{"line_number":61,"context_line":"    op.create_index(op.f(\u0027ix_classificationgrouprbacs_project_id\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_813aa495","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":38},"updated":"2019-09-10 16:47:48.000000000","message":"Not needed","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        sa.ForeignKeyConstraint([\u0027object_id\u0027],"},{"line_number":56,"context_line":"                                [\u0027classification_groups.id\u0027],"},{"line_number":57,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":58,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":59,"context_line":"        sa.UniqueConstraint(\u0027target_tenant\u0027,"},{"line_number":60,"context_line":"                            \u0027object_id\u0027, \u0027action\u0027))"},{"line_number":61,"context_line":"    op.create_index(op.f(\u0027ix_classificationgrouprbacs_project_id\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_7571c4a7","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":38},"in_reply_to":"5faad753_813aa495","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    op.create_table("},{"line_number":66,"context_line":"        \u0027classifications\u0027,"},{"line_number":67,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), primary_key\u003dTrue),"},{"line_number":68,"context_line":"        sa.Column(\u0027c_type\u0027, sa.String(length\u003d36)),"},{"line_number":69,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d255)),"},{"line_number":70,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003d255)),"},{"line_number":71,"context_line":"        sa.Column(\u0027negated\u0027, sa.Boolean()),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_e14a7825","line":68,"updated":"2019-09-10 16:47:48.000000000","message":"Shouldn\u0027t this be nullable\u003dFalse?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    op.create_table("},{"line_number":66,"context_line":"        \u0027classifications\u0027,"},{"line_number":67,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), primary_key\u003dTrue),"},{"line_number":68,"context_line":"        sa.Column(\u0027c_type\u0027, sa.String(length\u003d36)),"},{"line_number":69,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d255)),"},{"line_number":70,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003d255)),"},{"line_number":71,"context_line":"        sa.Column(\u0027negated\u0027, sa.Boolean()),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_156c10cc","line":68,"in_reply_to":"5faad753_e14a7825","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f7abccd22085992c9ce310735ba2f7445ea39b36","unresolved":false,"context_lines":[{"line_number":26,"context_line":"\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# revision identifiers, used by Alembic."},{"line_number":29,"context_line":"revision \u003d \u0027ae8df423b477\u0027"},{"line_number":30,"context_line":"down_revision \u003d \u0027c613d0b82681\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_71fe863a","line":29,"updated":"2019-12-17 11:10:39.000000000","message":"This should point now to Ussuri","commit_id":"2884c83501bce285579760aee854275eae6d312a"}],"neutron/extensions/classification.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aafd21b23fb2dcafaffaecacaec2d996dd12eddb","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.api.v2 import resource_helper"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class Classification(api_ext.ExtensionDescriptor):"},{"line_number":27,"context_line":"    \"\"\"Classification API extension.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_70d06020","line":26,"range":{"start_line":26,"start_character":29,"end_line":26,"end_character":48},"updated":"2019-07-30 15:04:49.000000000","message":"Why don\u0027t you use api_ext.APIExtensionDescriptor?\n\nYou can avoid defining most of these functions","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"cc7bc6821ead21b2fd460d432b649d1b8219a615","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.api.v2 import resource_helper"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class Classification(api_ext.ExtensionDescriptor):"},{"line_number":27,"context_line":"    \"\"\"Classification API extension.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_c9bc4a6e","line":26,"range":{"start_line":26,"start_character":29,"end_line":26,"end_character":48},"in_reply_to":"7faddb67_70d06020","updated":"2019-08-12 16:33:16.000000000","message":"Done","commit_id":"ac697d0f928e813ba02db8d6ec18717542af5bad"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        super(Classification, self).update_attributes_map("},{"line_number":56,"context_line":"            attributes, extension_attrs_map\u003dclass_def.RESOURCE_ATTRIBUTE_MAP)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_extended_resources(self, version):"},{"line_number":59,"context_line":"        return class_def.RESOURCE_ATTRIBUTE_MAP"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_c143bcae","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":46},"updated":"2019-09-10 16:47:48.000000000","message":"This is already implemented in APIExtensionDescriptor","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        super(Classification, self).update_attributes_map("},{"line_number":56,"context_line":"            attributes, extension_attrs_map\u003dclass_def.RESOURCE_ATTRIBUTE_MAP)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_extended_resources(self, version):"},{"line_number":59,"context_line":"        return class_def.RESOURCE_ATTRIBUTE_MAP"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_fb15a53d","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":46},"in_reply_to":"5faad753_c143bcae","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"777fd298edd483d9427ce81558d04fa84204685d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":60,"context_line":"class NeutronClassificationPluginBase(service_base.ServicePluginBase):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    path_prefix \u003d class_def.API_PREFIX"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def get_plugin_name(self):"},{"line_number":65,"context_line":"        return \"neutron_classifier\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_plugin_type(self):"},{"line_number":68,"context_line":"        return \"neutron_classifier\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def get_plugin_description(self):"},{"line_number":71,"context_line":"        return (\u0027Service plugin to provide Neutron Projects with a \u0027"},{"line_number":72,"context_line":"                \u0027consistent API for classifying traffic\u0027)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @abc.abstractmethod"},{"line_number":75,"context_line":"    def create_classification(self, context, classification):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_c0f10d6c","line":72,"range":{"start_line":62,"start_character":0,"end_line":72,"end_character":57},"updated":"2020-01-07 12:27:11.000000000","message":"If I understand well these things are defined in neutron-lib:\nhttps://review.opendev.org/#/c/670049/6/neutron_lib/api/definitions/classification.py\n\nBut to tell the truth I am not sure which of these are duplicated","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7abba06e3916e8dcb6c16b66d525ada704a4eb48","unresolved":false,"context_lines":[{"line_number":59,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":60,"context_line":"class NeutronClassificationPluginBase(service_base.ServicePluginBase):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    path_prefix \u003d class_def.API_PREFIX"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def get_plugin_name(self):"},{"line_number":65,"context_line":"        return \"neutron_classifier\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_plugin_type(self):"},{"line_number":68,"context_line":"        return \"neutron_classifier\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def get_plugin_description(self):"},{"line_number":71,"context_line":"        return (\u0027Service plugin to provide Neutron Projects with a \u0027"},{"line_number":72,"context_line":"                \u0027consistent API for classifying traffic\u0027)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @abc.abstractmethod"},{"line_number":75,"context_line":"    def create_classification(self, context, classification):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_d5bbbbbb","line":72,"range":{"start_line":62,"start_character":0,"end_line":72,"end_character":57},"in_reply_to":"3fa7e38b_c0f10d6c","updated":"2020-01-17 10:59:14.000000000","message":"Done","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"}],"neutron/objects/extensions/classification.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    fields \u003d {"},{"line_number":35,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":36,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":37,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":38,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":39,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_a4356edc","line":36,"updated":"2019-09-10 16:47:48.000000000","message":"nullable\u003dTrue","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    fields \u003d {"},{"line_number":35,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":36,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":37,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":38,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":39,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_5b5879f8","line":36,"in_reply_to":"5faad753_a4356edc","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    fields \u003d {"},{"line_number":35,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":36,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":37,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":38,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":39,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":40,"context_line":"        \u0027operator\u0027: obj_fields.EnumField([\u0027AND\u0027, \u0027OR\u0027], default\u003d\u0027AND\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_c102dc0b","line":37,"range":{"start_line":37,"start_character":46,"end_line":37,"end_character":47},"updated":"2019-09-10 16:47:48.000000000","message":"nullable\u003dTrue","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    fields \u003d {"},{"line_number":35,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":36,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":37,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":38,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":39,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":40,"context_line":"        \u0027operator\u0027: obj_fields.EnumField([\u0027AND\u0027, \u0027OR\u0027], default\u003d\u0027AND\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_7b5bf5f4","line":37,"range":{"start_line":37,"start_character":46,"end_line":37,"end_character":47},"in_reply_to":"5faad753_c102dc0b","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def get_bound_tenant_ids(cls, context, **kwargs):"},{"line_number":59,"context_line":"        # If we can return the policy regardless of tenant, we don\u0027t need"},{"line_number":60,"context_line":"        # to return the tenant id."},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_a491ee9b","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":12},"updated":"2019-09-10 16:47:48.000000000","message":"So this should be \"return\"","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def get_bound_tenant_ids(cls, context, **kwargs):"},{"line_number":59,"context_line":"        # If we can return the policy regardless of tenant, we don\u0027t need"},{"line_number":60,"context_line":"        # to return the tenant id."},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_1b768171","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":12},"in_reply_to":"5faad753_a491ee9b","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class CGToClassificationMapping(base.NeutronDbObject):"},{"line_number":66,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    rbac_db_model \u003d models.ClassificationGroupRBAC"},{"line_number":69,"context_line":"    db_model \u003d models.CGToClassificationMapping"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_61c76814","line":68,"updated":"2019-09-10 16:47:48.000000000","message":"We don\u0027t need RBAC in those mapping objects","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class CGToClassificationMapping(base.NeutronDbObject):"},{"line_number":66,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    rbac_db_model \u003d models.ClassificationGroupRBAC"},{"line_number":69,"context_line":"    db_model \u003d models.CGToClassificationMapping"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_3b71fd76","line":68,"in_reply_to":"5faad753_61c76814","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":77,"context_line":"class CGToClassificationGroupMapping(base.NeutronDbObject):"},{"line_number":78,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    rbac_db_model \u003d models.ClassificationGroupRBAC"},{"line_number":81,"context_line":"    db_model \u003d models.CGToClassificationGroupMapping"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_21d170ce","line":80,"updated":"2019-09-10 16:47:48.000000000","message":"We don\u0027t need RBAC in those mapping objects","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":77,"context_line":"class CGToClassificationGroupMapping(base.NeutronDbObject):"},{"line_number":78,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    rbac_db_model \u003d models.ClassificationGroupRBAC"},{"line_number":81,"context_line":"    db_model \u003d models.CGToClassificationGroupMapping"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_db6b0982","line":80,"in_reply_to":"5faad753_21d170ce","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":97,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":98,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":99,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":100,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_445a7a2a","line":97,"updated":"2019-09-10 16:47:48.000000000","message":"nullable\u003dTrue","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":97,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":98,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":99,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":100,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_9b07d1ca","line":97,"in_reply_to":"5faad753_445a7a2a","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":97,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":98,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":99,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":100,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":101,"context_line":"        \u0027c_type\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_e4404638","line":98,"updated":"2019-09-10 16:47:48.000000000","message":"nullable\u003dTrue","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027id\u0027: common_types.UUIDField(),"},{"line_number":97,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":98,"context_line":"        \u0027description\u0027: obj_fields.StringField(),"},{"line_number":99,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":100,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":101,"context_line":"        \u0027c_type\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_5b0dd9e5","line":98,"in_reply_to":"5faad753_e4404638","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    fields_no_update \u003d [\u0027id\u0027, \u0027c_type\u0027]"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def create(self):"},{"line_number":108,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":109,"context_line":"            super(Classification, self).create()"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_24f3be0c","line":107,"updated":"2019-09-10 16:47:48.000000000","message":"Why are you implementing this method?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    fields_no_update \u003d [\u0027id\u0027, \u0027c_type\u0027]"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def create(self):"},{"line_number":108,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":109,"context_line":"            super(Classification, self).create()"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_bb33adaa","line":107,"in_reply_to":"5faad753_24f3be0c","updated":"2019-10-02 12:56:16.000000000","message":"Originally when the relationship between classification and definition was different there was relevant code here, I missed cleaning these up during the refactor, sorry!","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            super(Classification, self).create()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @classmethod"},{"line_number":112,"context_line":"    def get_objects(cls, context, _pager\u003dNone, validate_filters\u003dTrue,"},{"line_number":113,"context_line":"                    **kwargs):"},{"line_number":114,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":115,"context_line":"            objects \u003d super(Classification,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_44f6fafb","line":112,"updated":"2019-09-10 16:47:48.000000000","message":"ditto and for the rest of objects below","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            super(Classification, self).create()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @classmethod"},{"line_number":112,"context_line":"    def get_objects(cls, context, _pager\u003dNone, validate_filters\u003dTrue,"},{"line_number":113,"context_line":"                    **kwargs):"},{"line_number":114,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":115,"context_line":"            objects \u003d super(Classification,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_5b26396a","line":112,"in_reply_to":"5faad753_44f6fafb","updated":"2019-10-02 12:56:16.000000000","message":"Done","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2c6291bb71a876c6edba38f957a7d94457470167","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            return obj"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"# NOTE(ndahiwade): These methods were added to get the list of mapped"},{"line_number":269,"context_line":"# classifications and classification groups to a ClassificationGroup as"},{"line_number":270,"context_line":"# currently we don\u0027t have synthetic fields supporting subclasses and"},{"line_number":271,"context_line":"# self-referential relationships."},{"line_number":272,"context_line":"def _get_mapped_classifications(context, obj):"},{"line_number":273,"context_line":"    \"\"\"Returns a list of classifications mapped to a classification group."},{"line_number":274,"context_line":"    :param context:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5faad753_24417e0c","line":271,"range":{"start_line":268,"start_character":0,"end_line":271,"end_character":33},"updated":"2019-09-10 16:47:48.000000000","message":"I don\u0027t understand this comment. You should have those synthetic fields in ClassificationGroup to provide a tree of CG and C. If not, what is the purpose of OVO ClassificationGroup?","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7fa7034df343e68391abc72ecd70ad2506c1b893","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            return obj"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"# NOTE(ndahiwade): These methods were added to get the list of mapped"},{"line_number":269,"context_line":"# classifications and classification groups to a ClassificationGroup as"},{"line_number":270,"context_line":"# currently we don\u0027t have synthetic fields supporting subclasses and"},{"line_number":271,"context_line":"# self-referential relationships."},{"line_number":272,"context_line":"def _get_mapped_classifications(context, obj):"},{"line_number":273,"context_line":"    \"\"\"Returns a list of classifications mapped to a classification group."},{"line_number":274,"context_line":"    :param context:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_de7f6c12","line":271,"range":{"start_line":268,"start_character":0,"end_line":271,"end_character":33},"in_reply_to":"5faad753_24417e0c","updated":"2019-10-02 12:56:16.000000000","message":"I think this is poorly phrased, If i remember right, because the classifications are independent from the classifications groups and can be in multiple groups the synthetic fields wouldn\u0027t work with the relationship between the resources that we agreed in the spec.","commit_id":"c42d9743ce2d9a7a7e9ca0af71e1379c7bd711ec"}],"neutron/services/classification/exceptions.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"777fd298edd483d9427ce81558d04fa84204685d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3fa7e38b_3b91329b","updated":"2020-01-07 12:27:11.000000000","message":"This is defined in neutron-lib:\nhttps://review.opendev.org/#/c/670049/6/neutron_lib/exceptions/classification.py","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9f2e2e0acaebd6712c344bed513922f19c657706","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3fa7e38b_427f01bc","in_reply_to":"3fa7e38b_3b91329b","updated":"2020-01-24 11:06:24.000000000","message":"+1, you are right!","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"}],"neutron/services/classification/plugin.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"777fd298edd483d9427ce81558d04fa84204685d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.objects import base as base_obj"},{"line_number":22,"context_line":"from neutron.objects.extensions import classification as class_obj"},{"line_number":23,"context_line":"from neutron.services.classification import advertiser"},{"line_number":24,"context_line":"# NOTE just to avoid import error from neutron-lib"},{"line_number":25,"context_line":"from neutron.services.classification import exceptions"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_bbea020b","line":25,"range":{"start_line":24,"start_character":0,"end_line":25,"end_character":54},"updated":"2020-01-07 12:27:11.000000000","message":"Ahhh, ok I see now why the exceptions are duplicated.\nAnyway sadly you cannot pass the gate till neutron-lib is not released with the https://review.opendev.org/670049","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"777fd298edd483d9427ce81558d04fa84204685d","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CLASS_HEADERS \u003d {\u0027ethernet\u0027: [\u0027ethertype\u0027, \u0027src_addr\u0027, \u0027dst_addr\u0027],"},{"line_number":31,"context_line":"                 \u0027ipv4\u0027: [\u0027protocol\u0027, \u0027ttl_min\u0027, \u0027ecn\u0027, \u0027dscp\u0027, \u0027length_max\u0027,"},{"line_number":32,"context_line":"                          \u0027src_addr\u0027, \u0027length_min\u0027, \u0027dscp_mask\u0027, \u0027flags_mask\u0027,"},{"line_number":33,"context_line":"                          \u0027ttl_max\u0027, \u0027flags\u0027, \u0027dst_addr\u0027],"},{"line_number":34,"context_line":"                 \u0027ipv6\u0027: [\u0027hops_min\u0027, \u0027src_addr\u0027, \u0027dscp_mask\u0027, \u0027length_max\u0027,"},{"line_number":35,"context_line":"                          \u0027ecn\u0027, \u0027next_header\u0027, \u0027length_min\u0027, \u0027dst_addr\u0027,"},{"line_number":36,"context_line":"                          \u0027dscp\u0027, \u0027hops_max\u0027],"},{"line_number":37,"context_line":"                 \u0027tcp\u0027: [\u0027dst_port_min\u0027, \u0027window_min\u0027, \u0027flags\u0027,"},{"line_number":38,"context_line":"                         \u0027src_port_min\u0027, \u0027flags_mask\u0027, \u0027src_port_max\u0027,"},{"line_number":39,"context_line":"                         \u0027dst_port_max\u0027, \u0027window_max\u0027],"},{"line_number":40,"context_line":"                 \u0027udp\u0027: [\u0027dst_port_min\u0027, \u0027src_port_min\u0027, \u0027length_min\u0027,"},{"line_number":41,"context_line":"                         \u0027dst_port_max\u0027, \u0027src_port_max\u0027, \u0027length_max\u0027]}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class ClassificationPlugin(ext_base.NeutronClassificationPluginBase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_3bd61255","line":41,"range":{"start_line":30,"start_character":0,"end_line":41,"end_character":71},"updated":"2020-01-07 12:27:11.000000000","message":"These definitions should be in neutron-lib, I think (https://review.opendev.org/#/c/670049/6/neutron_lib/constants.py)","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"7abba06e3916e8dcb6c16b66d525ada704a4eb48","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CLASS_HEADERS \u003d {\u0027ethernet\u0027: [\u0027ethertype\u0027, \u0027src_addr\u0027, \u0027dst_addr\u0027],"},{"line_number":31,"context_line":"                 \u0027ipv4\u0027: [\u0027protocol\u0027, \u0027ttl_min\u0027, \u0027ecn\u0027, \u0027dscp\u0027, \u0027length_max\u0027,"},{"line_number":32,"context_line":"                          \u0027src_addr\u0027, \u0027length_min\u0027, \u0027dscp_mask\u0027, \u0027flags_mask\u0027,"},{"line_number":33,"context_line":"                          \u0027ttl_max\u0027, \u0027flags\u0027, \u0027dst_addr\u0027],"},{"line_number":34,"context_line":"                 \u0027ipv6\u0027: [\u0027hops_min\u0027, \u0027src_addr\u0027, \u0027dscp_mask\u0027, \u0027length_max\u0027,"},{"line_number":35,"context_line":"                          \u0027ecn\u0027, \u0027next_header\u0027, \u0027length_min\u0027, \u0027dst_addr\u0027,"},{"line_number":36,"context_line":"                          \u0027dscp\u0027, \u0027hops_max\u0027],"},{"line_number":37,"context_line":"                 \u0027tcp\u0027: [\u0027dst_port_min\u0027, \u0027window_min\u0027, \u0027flags\u0027,"},{"line_number":38,"context_line":"                         \u0027src_port_min\u0027, \u0027flags_mask\u0027, \u0027src_port_max\u0027,"},{"line_number":39,"context_line":"                         \u0027dst_port_max\u0027, \u0027window_max\u0027],"},{"line_number":40,"context_line":"                 \u0027udp\u0027: [\u0027dst_port_min\u0027, \u0027src_port_min\u0027, \u0027length_min\u0027,"},{"line_number":41,"context_line":"                         \u0027dst_port_max\u0027, \u0027src_port_max\u0027, \u0027length_max\u0027]}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class ClassificationPlugin(ext_base.NeutronClassificationPluginBase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_55e58bda","line":41,"range":{"start_line":30,"start_character":0,"end_line":41,"end_character":71},"in_reply_to":"3fa7e38b_3bd61255","updated":"2020-01-17 10:59:14.000000000","message":"I\u0027ll copy them over, but I\u0027ll also keep these here for the time being for gate testing until the Neutron-lib patch merges.","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9f2e2e0acaebd6712c344bed513922f19c657706","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CLASS_HEADERS \u003d {\u0027ethernet\u0027: [\u0027ethertype\u0027, \u0027src_addr\u0027, \u0027dst_addr\u0027],"},{"line_number":31,"context_line":"                 \u0027ipv4\u0027: [\u0027protocol\u0027, \u0027ttl_min\u0027, \u0027ecn\u0027, \u0027dscp\u0027, \u0027length_max\u0027,"},{"line_number":32,"context_line":"                          \u0027src_addr\u0027, \u0027length_min\u0027, \u0027dscp_mask\u0027, \u0027flags_mask\u0027,"},{"line_number":33,"context_line":"                          \u0027ttl_max\u0027, \u0027flags\u0027, \u0027dst_addr\u0027],"},{"line_number":34,"context_line":"                 \u0027ipv6\u0027: [\u0027hops_min\u0027, \u0027src_addr\u0027, \u0027dscp_mask\u0027, \u0027length_max\u0027,"},{"line_number":35,"context_line":"                          \u0027ecn\u0027, \u0027next_header\u0027, \u0027length_min\u0027, \u0027dst_addr\u0027,"},{"line_number":36,"context_line":"                          \u0027dscp\u0027, \u0027hops_max\u0027],"},{"line_number":37,"context_line":"                 \u0027tcp\u0027: [\u0027dst_port_min\u0027, \u0027window_min\u0027, \u0027flags\u0027,"},{"line_number":38,"context_line":"                         \u0027src_port_min\u0027, \u0027flags_mask\u0027, \u0027src_port_max\u0027,"},{"line_number":39,"context_line":"                         \u0027dst_port_max\u0027, \u0027window_max\u0027],"},{"line_number":40,"context_line":"                 \u0027udp\u0027: [\u0027dst_port_min\u0027, \u0027src_port_min\u0027, \u0027length_min\u0027,"},{"line_number":41,"context_line":"                         \u0027dst_port_max\u0027, \u0027src_port_max\u0027, \u0027length_max\u0027]}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class ClassificationPlugin(ext_base.NeutronClassificationPluginBase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_85956733","line":41,"range":{"start_line":30,"start_character":0,"end_line":41,"end_character":71},"in_reply_to":"3fa7e38b_55e58bda","updated":"2020-01-24 11:06:24.000000000","message":"Let\u0027s focus on this n-lib one, to merge it and then release a n-lib version. Although we\u0027ll probably have only this commit, the change is big enough to have its own release.","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0a4cebfdb0a340ed925a2d110c8ef0f59309ee20","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CLASS_HEADERS \u003d {\u0027ethernet\u0027: [\u0027ethertype\u0027, \u0027src_addr\u0027, \u0027dst_addr\u0027],"},{"line_number":31,"context_line":"                 \u0027ipv4\u0027: [\u0027protocol\u0027, \u0027ttl_min\u0027, \u0027ecn\u0027, \u0027dscp\u0027, \u0027length_max\u0027,"},{"line_number":32,"context_line":"                          \u0027src_addr\u0027, \u0027length_min\u0027, \u0027dscp_mask\u0027, \u0027flags_mask\u0027,"},{"line_number":33,"context_line":"                          \u0027ttl_max\u0027, \u0027flags\u0027, \u0027dst_addr\u0027],"},{"line_number":34,"context_line":"                 \u0027ipv6\u0027: [\u0027hops_min\u0027, \u0027src_addr\u0027, \u0027dscp_mask\u0027, \u0027length_max\u0027,"},{"line_number":35,"context_line":"                          \u0027ecn\u0027, \u0027next_header\u0027, \u0027length_min\u0027, \u0027dst_addr\u0027,"},{"line_number":36,"context_line":"                          \u0027dscp\u0027, \u0027hops_max\u0027],"},{"line_number":37,"context_line":"                 \u0027tcp\u0027: [\u0027dst_port_min\u0027, \u0027window_min\u0027, \u0027flags\u0027,"},{"line_number":38,"context_line":"                         \u0027src_port_min\u0027, \u0027flags_mask\u0027, \u0027src_port_max\u0027,"},{"line_number":39,"context_line":"                         \u0027dst_port_max\u0027, \u0027window_max\u0027],"},{"line_number":40,"context_line":"                 \u0027udp\u0027: [\u0027dst_port_min\u0027, \u0027src_port_min\u0027, \u0027length_min\u0027,"},{"line_number":41,"context_line":"                         \u0027dst_port_max\u0027, \u0027src_port_max\u0027, \u0027length_max\u0027]}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class ClassificationPlugin(ext_base.NeutronClassificationPluginBase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_0093a55a","line":41,"range":{"start_line":30,"start_character":0,"end_line":41,"end_character":71},"in_reply_to":"3fa7e38b_85956733","updated":"2020-01-30 16:24:59.000000000","message":"+1","commit_id":"0789c5fb58cf6ed987f89b215dc9405e2ed0f3f1"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0a4cebfdb0a340ed925a2d110c8ef0f59309ee20","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            if len(c_types) !\u003d len(c_objs):"},{"line_number":132,"context_line":"                raise exceptions.InvalidClassificationDuplicateTypes()"},{"line_number":133,"context_line":"            if \u0027udp\u0027 in c_types or \u0027tcp\u0027 in c_types:"},{"line_number":134,"context_line":"                if \u0027ipv4\u0027 not in c_types or \u0027ipv6\u0027 not in c_types:"},{"line_number":135,"context_line":"                    raise exceptions.InvalidClassificationLayer4Dependency()"},{"line_number":136,"context_line":"            if \u0027ipv4\u0027 in c_types or \u0027ipv6\u0027 in c_types:"},{"line_number":137,"context_line":"                if \u0027ethernet\u0027 not in c_types:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_fa0a661d","line":134,"range":{"start_line":134,"start_character":41,"end_line":134,"end_character":43},"updated":"2020-01-30 16:24:59.000000000","message":"or -\u003e and\n\nI have this in the log:\nDavid: c_types: {\u0027tcp\u0027, \u0027ethernet\u0027, \u0027ipv4\u0027}\nDavid: operand: AND\nAnd I have neutron.services.classification.exceptions.InvalidClassificationLayer4Dependency","commit_id":"3ad3ca472e6fedca5b1a2fa0da4f54205d447a7d"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"615d8ad843320660c13b25c5c362fc76380ade44","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            if len(c_types) !\u003d len(c_objs):"},{"line_number":132,"context_line":"                raise exceptions.InvalidClassificationDuplicateTypes()"},{"line_number":133,"context_line":"            if \u0027udp\u0027 in c_types or \u0027tcp\u0027 in c_types:"},{"line_number":134,"context_line":"                if \u0027ipv4\u0027 not in c_types or \u0027ipv6\u0027 not in c_types:"},{"line_number":135,"context_line":"                    raise exceptions.InvalidClassificationLayer4Dependency()"},{"line_number":136,"context_line":"            if \u0027ipv4\u0027 in c_types or \u0027ipv6\u0027 in c_types:"},{"line_number":137,"context_line":"                if \u0027ethernet\u0027 not in c_types:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_9a0252b9","line":134,"range":{"start_line":134,"start_character":41,"end_line":134,"end_character":43},"in_reply_to":"3fa7e38b_fa0a661d","updated":"2020-01-30 16:45:43.000000000","message":"I just caught that earlier, I\u0027ll push my updated service plugin before tomorrow with this issue fixed.\nThanks!","commit_id":"3ad3ca472e6fedca5b1a2fa0da4f54205d447a7d"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8b405ddee0a8e1c716df023711dda4720800176e","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    def delete_classification(self, context, classification_id):"},{"line_number":199,"context_line":"        cl_obj \u003d class_obj.Classification.get_object(context,"},{"line_number":200,"context_line":"                                                     id\u003dclassification_id)"},{"line_number":201,"context_line":"        self.check_valid_classifications(context, [classification_id],"},{"line_number":202,"context_line":"                                         cl_obj.operator)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":205,"context_line":"            cl_obj.delete()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_0a3f46b2","line":202,"range":{"start_line":201,"start_character":8,"end_line":202,"end_character":57},"updated":"2020-01-24 09:37:22.000000000","message":"For DELETE v2.0/classifications/\u003cuuid\u003e here I got exception:\n\nJan 24 08:37:28 controller neutron-server[12908]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/opt/stack/neutron/neutron/services/classification/plugin.py\", line 202, in delete_classification\nJan 24 08:37:28 controller neutron-server[12908]: ERROR neutron.pecan_wsgi.hooks.translation     cl_obj.operator)\nJan 24 08:37:28 controller neutron-server[12908]: ERROR neutron.pecan_wsgi.hooks.translation AttributeError: \u0027Classification\u0027 object has no attribute \u0027operator\u0027\n\nI am not sure why you need to verify the operator here which is for classification_groups?","commit_id":"3ad3ca472e6fedca5b1a2fa0da4f54205d447a7d"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"615d8ad843320660c13b25c5c362fc76380ade44","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    def delete_classification(self, context, classification_id):"},{"line_number":199,"context_line":"        cl_obj \u003d class_obj.Classification.get_object(context,"},{"line_number":200,"context_line":"                                                     id\u003dclassification_id)"},{"line_number":201,"context_line":"        self.check_valid_classifications(context, [classification_id],"},{"line_number":202,"context_line":"                                         cl_obj.operator)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":205,"context_line":"            cl_obj.delete()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_bafaaeb8","line":202,"range":{"start_line":201,"start_character":8,"end_line":202,"end_character":57},"in_reply_to":"3fa7e38b_0a3f46b2","updated":"2020-01-30 16:45:43.000000000","message":"Thanks, I\u0027ll take this out!","commit_id":"3ad3ca472e6fedca5b1a2fa0da4f54205d447a7d"}]}
