)]}'
{"dragonflow/db/field_types.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"daf79cb44e69caa4abf21609a5420652e26963cf","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def parse_value(self, value):"},{"line_number":201,"context_line":"        if value is not None:"},{"line_number":202,"context_line":"            return PortRange(value[0], value[1])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_f0ea230e","line":202,"range":{"start_line":202,"start_character":29,"end_line":202,"end_character":47},"updated":"2017-02-08 09:24:29.000000000","message":"nit: Maybe send *value, instead? e.g. return PortRange(*value)? This will also verify that value is the correct structure (list of tuple), and has exactly two items?","commit_id":"c2aba4d6b476eae3a2b2611ef07b0845d1e349b2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"69809e9de2a2584a0e3e18d30352d475d6a8ec32","unresolved":false,"context_lines":[{"line_number":205,"context_line":"class PortRange(object):"},{"line_number":206,"context_line":"    def __init__(self, min, max):"},{"line_number":207,"context_line":"        self.min \u003d min"},{"line_number":208,"context_line":"        self.max \u003d max"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_13b6828a","line":208,"updated":"2017-03-07 10:29:55.000000000","message":"Maybe put get_port_match_list_from_port_range here? Rather than in utils?","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"05a42e0605cf89b9e01e1f0ae157f40bec55d1e1","unresolved":false,"context_lines":[{"line_number":205,"context_line":"class PortRange(object):"},{"line_number":206,"context_line":"    def __init__(self, min, max):"},{"line_number":207,"context_line":"        self.min \u003d min"},{"line_number":208,"context_line":"        self.max \u003d max"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_55bfc2fa","line":208,"in_reply_to":"9a30ddce_13b6828a","updated":"2017-03-08 13:14:15.000000000","message":"Will add as @classmethod","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"69809e9de2a2584a0e3e18d30352d475d6a8ec32","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def parse_value(self, value):"},{"line_number":221,"context_line":"        if value is not None:"},{"line_number":222,"context_line":"            return PortRange(value[0], value[1])"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_3311c6ad","line":222,"range":{"start_line":222,"start_character":29,"end_line":222,"end_character":47},"updated":"2017-03-07 10:29:55.000000000","message":"Comment from PS6 was ignored:\n\n\u003e nit: Maybe send *value, instead? e.g. return PortRange(*value)? This will also verify that value is the correct structure (list of tuple), and has exactly two items?","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"05a42e0605cf89b9e01e1f0ae157f40bec55d1e1","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def parse_value(self, value):"},{"line_number":221,"context_line":"        if value is not None:"},{"line_number":222,"context_line":"            return PortRange(value[0], value[1])"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_75ba060c","line":222,"range":{"start_line":222,"start_character":29,"end_line":222,"end_character":47},"in_reply_to":"9a30ddce_3311c6ad","updated":"2017-03-08 13:14:15.000000000","message":"Will add validation","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"e1d6ebeff0595f4a8f7c6fb11f7e6b82e5fbfd35","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                        valid_values\u003d\u0027, \u0027.join(self._valid_values)))"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class PortRange(object):"},{"line_number":238,"context_line":"    def __init__(self, port_min, port_max):"},{"line_number":239,"context_line":"        self.min \u003d port_min"},{"line_number":240,"context_line":"        self.max \u003d port_max"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f231b9d_db86ab66","line":237,"range":{"start_line":237,"start_character":6,"end_line":237,"end_character":15},"updated":"2017-06-19 07:12:28.000000000","message":"May need validator ?    \n(Both positive integers and port_min \u003c\u003d port_max )","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f44efea0ae2cc5dbaf35fa98d71e156f6489beda","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                        valid_values\u003d\u0027, \u0027.join(self._valid_values)))"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class PortRange(object):"},{"line_number":238,"context_line":"    def __init__(self, port_min, port_max):"},{"line_number":239,"context_line":"        self.min \u003d port_min"},{"line_number":240,"context_line":"        self.max \u003d port_max"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_5a99551d","line":237,"range":{"start_line":237,"start_character":6,"end_line":237,"end_character":15},"in_reply_to":"7f231b9d_db86ab66","updated":"2017-06-29 07:13:08.000000000","message":"This is initialized from the API objects, the API handles the validation.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"da4a76961f30e430054ca56f9bae4d87769723f1","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        self.min \u003d port_min"},{"line_number":240,"context_line":"        self.max \u003d port_max"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @classmethod"},{"line_number":243,"context_line":"    def from_min_max(cls, port_min, port_max):"},{"line_number":244,"context_line":"        if port_min is not None and port_max is not None:"},{"line_number":245,"context_line":"            return cls(port_min, port_max)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":19,"id":"ff0f0b1f_4fce5f5a","line":245,"range":{"start_line":242,"start_character":0,"end_line":245,"end_character":42},"updated":"2017-05-24 13:13:42.000000000","message":"Has it been used?","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4527120e5f0ccf4f264600db3221fc4b187798b4","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        self.min \u003d port_min"},{"line_number":240,"context_line":"        self.max \u003d port_max"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @classmethod"},{"line_number":243,"context_line":"    def from_min_max(cls, port_min, port_max):"},{"line_number":244,"context_line":"        if port_min is not None and port_max is not None:"},{"line_number":245,"context_line":"            return cls(port_min, port_max)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_81ae4b96","line":245,"range":{"start_line":242,"start_character":0,"end_line":245,"end_character":42},"in_reply_to":"3f1d235d_1aee3d88","updated":"2017-07-09 07:00:29.000000000","message":"Good enough.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f44efea0ae2cc5dbaf35fa98d71e156f6489beda","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        self.min \u003d port_min"},{"line_number":240,"context_line":"        self.max \u003d port_max"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @classmethod"},{"line_number":243,"context_line":"    def from_min_max(cls, port_min, port_max):"},{"line_number":244,"context_line":"        if port_min is not None and port_max is not None:"},{"line_number":245,"context_line":"            return cls(port_min, port_max)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_1aee3d88","line":245,"range":{"start_line":242,"start_character":0,"end_line":245,"end_character":42},"in_reply_to":"df140735_0f017038","updated":"2017-06-29 07:13:08.000000000","message":"Because constructor always return an object, but this can return nothing if the params are not initialized.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c6a5b72c139cf433b9638365f5de8a793ca1850e","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        self.min \u003d port_min"},{"line_number":240,"context_line":"        self.max \u003d port_max"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @classmethod"},{"line_number":243,"context_line":"    def from_min_max(cls, port_min, port_max):"},{"line_number":244,"context_line":"        if port_min is not None and port_max is not None:"},{"line_number":245,"context_line":"            return cls(port_min, port_max)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_0f017038","line":245,"range":{"start_line":242,"start_character":0,"end_line":245,"end_character":42},"in_reply_to":"df140735_567e8a19","updated":"2017-06-06 07:25:15.000000000","message":"Why not just use the constructor?","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"a9d9388fb1b4a93034daf6b3d4512ac731751755","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        self.min \u003d port_min"},{"line_number":240,"context_line":"        self.max \u003d port_max"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @classmethod"},{"line_number":243,"context_line":"    def from_min_max(cls, port_min, port_max):"},{"line_number":244,"context_line":"        if port_min is not None and port_max is not None:"},{"line_number":245,"context_line":"            return cls(port_min, port_max)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_567e8a19","line":245,"range":{"start_line":242,"start_character":0,"end_line":245,"end_character":42},"in_reply_to":"ff0f0b1f_4fce5f5a","updated":"2017-05-31 07:04:48.000000000","message":"Yes, in the FlowClassifier driver","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2f6d96d149f8b072b1852dd440bab61889d95537","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        self.min \u003d port_min"},{"line_number":261,"context_line":"        self.max \u003d port_max"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    @classmethod"},{"line_number":264,"context_line":"    def from_min_max(cls, port_min, port_max):"},{"line_number":265,"context_line":"        if port_min is not None and port_max is not None:"},{"line_number":266,"context_line":"            return cls(port_min, port_max)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_9f36d202","line":266,"range":{"start_line":263,"start_character":1,"end_line":266,"end_character":42},"updated":"2017-06-28 13:08:46.000000000","message":"This wasn\u0027t answered from PS19","commit_id":"bb8fc1076ac7c41b4ccecad1432acbeb353a6c00"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0925607838d9592ac00ce8c822219675952ca0e9","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        self.min \u003d port_min"},{"line_number":261,"context_line":"        self.max \u003d port_max"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    @classmethod"},{"line_number":264,"context_line":"    def from_min_max(cls, port_min, port_max):"},{"line_number":265,"context_line":"        if port_min is not None and port_max is not None:"},{"line_number":266,"context_line":"            return cls(port_min, port_max)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"class PortRangeField(fields.BaseField):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f1d235d_3a9e9907","line":266,"range":{"start_line":263,"start_character":1,"end_line":266,"end_character":42},"in_reply_to":"5f201791_9f36d202","updated":"2017-06-29 07:12:54.000000000","message":"Done","commit_id":"bb8fc1076ac7c41b4ccecad1432acbeb353a6c00"}],"dragonflow/db/models/sfc.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c6a5b72c139cf433b9638365f5de8a793ca1850e","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    ingress_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":33,"context_line":"    egress_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":34,"context_line":"    correlation_mechanism \u003d df_fields.EnumField([\u0027none\u0027, \u0027mpls\u0027])"},{"line_number":35,"context_line":"    weight \u003d fields.FloatField()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_af65e41f","line":34,"range":{"start_line":34,"start_character":48,"end_line":34,"end_character":64},"updated":"2017-06-06 07:25:15.000000000","message":"Maybe make a constant?","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c6a5b72c139cf433b9638365f5de8a793ca1850e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \u0027dest_port\u0027: \u0027dest_port\u0027,"},{"line_number":58,"context_line":"    },"},{"line_number":59,"context_line":")"},{"line_number":60,"context_line":"class FlowClassifier(mf.ModelBase,"},{"line_number":61,"context_line":"                     mixins.BasicEvents,"},{"line_number":62,"context_line":"                     mixins.Topic,"},{"line_number":63,"context_line":"                     mixins.Name,"}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_2f2794cc","line":60,"range":{"start_line":60,"start_character":6,"end_line":60,"end_character":20},"updated":"2017-06-06 07:25:15.000000000","message":"What are the plans with the common classification mechanism? Will there be a migration once the spec is approved?\n\nI would think that on our end we could keep the classifier more generic (as is proposed in that spec), and then maybe this can be reused for LBaaS, FWaaS, and other features that require classification.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f44efea0ae2cc5dbaf35fa98d71e156f6489beda","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \u0027dest_port\u0027: \u0027dest_port\u0027,"},{"line_number":58,"context_line":"    },"},{"line_number":59,"context_line":")"},{"line_number":60,"context_line":"class FlowClassifier(mf.ModelBase,"},{"line_number":61,"context_line":"                     mixins.BasicEvents,"},{"line_number":62,"context_line":"                     mixins.Topic,"},{"line_number":63,"context_line":"                     mixins.Name,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_5d994f1d","line":60,"range":{"start_line":60,"start_character":6,"end_line":60,"end_character":20},"in_reply_to":"df140735_2f2794cc","updated":"2017-06-29 07:13:08.000000000","message":"We\u0027ll have to revise our classification objects once the API will get adopted by consuming services.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c6a5b72c139cf433b9638365f5de8a793ca1850e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                     mixins.UniqueKey):"},{"line_number":65,"context_line":"    table_name \u003d \u0027sfc_flowclassifier\u0027"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    ether_type \u003d df_fields.EnumField([\u0027IPv4\u0027, \u0027IPv6\u0027])"},{"line_number":68,"context_line":"    protocol \u003d df_fields.EnumField([\u0027TCP\u0027, \u0027UDP\u0027])"},{"line_number":69,"context_line":"    source_cidr \u003d df_fields.IpNetworkField()"},{"line_number":70,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":71,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_cf525835","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":50},"updated":"2017-06-06 07:25:15.000000000","message":"Maybe make the enums constant?","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f44efea0ae2cc5dbaf35fa98d71e156f6489beda","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                     mixins.UniqueKey):"},{"line_number":65,"context_line":"    table_name \u003d \u0027sfc_flowclassifier\u0027"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    ether_type \u003d df_fields.EnumField([\u0027IPv4\u0027, \u0027IPv6\u0027])"},{"line_number":68,"context_line":"    protocol \u003d df_fields.EnumField([\u0027TCP\u0027, \u0027UDP\u0027])"},{"line_number":69,"context_line":"    source_cidr \u003d df_fields.IpNetworkField()"},{"line_number":70,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":71,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_3de693ea","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":50},"in_reply_to":"df140735_cf525835","updated":"2017-06-29 07:13:08.000000000","message":"Done","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"da4a76961f30e430054ca56f9bae4d87769723f1","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    source_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":75,"context_line":"    dest_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":76,"context_line":"    # l7 parameters"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def is_classification_local(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"ff0f0b1f_0fed07b6","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":19},"updated":"2017-05-24 13:13:42.000000000","message":"It looks like a TODO to me.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"a9d9388fb1b4a93034daf6b3d4512ac731751755","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    source_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":75,"context_line":"    dest_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":76,"context_line":"    # l7 parameters"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def is_classification_local(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_3679d62e","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":19},"in_reply_to":"ff0f0b1f_0fed07b6","updated":"2017-05-31 07:04:48.000000000","message":"Will change","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c6a5b72c139cf433b9638365f5de8a793ca1850e","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def is_classification_local(self):"},{"line_number":80,"context_line":"        lport \u003d self.source_port or self.dest_port"},{"line_number":81,"context_line":"        return lport.is_local"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_6f122c64","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":50},"updated":"2017-06-06 07:25:15.000000000","message":"Is it possible that both ports are None? If not, maybe add a validation?","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f44efea0ae2cc5dbaf35fa98d71e156f6489beda","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def is_classification_local(self):"},{"line_number":80,"context_line":"        lport \u003d self.source_port or self.dest_port"},{"line_number":81,"context_line":"        return lport.is_local"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_3db1f3e2","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":50},"in_reply_to":"df140735_6f122c64","updated":"2017-06-29 07:13:08.000000000","message":"I think this validation is better suited for networking-sfc plugin","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"47dcfd3a2c5ad6b5c7190a0b962fff0626c4b7f4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                mixins.Name):"},{"line_number":95,"context_line":"    table_name \u003d \u0027sfc_portchain\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    PROTO_MPLS \u003d \u0027mpls\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    protocol \u003d df_fields.EnumField([PROTO_MPLS])"},{"line_number":100,"context_line":"    chain_id \u003d fields.IntField()"}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_66575728","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":23},"updated":"2017-06-02 02:22:39.000000000","message":"nit: move it to a constant file, i think it is useful for other modules, like sfc_app.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f44efea0ae2cc5dbaf35fa98d71e156f6489beda","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                mixins.Name):"},{"line_number":95,"context_line":"    table_name \u003d \u0027sfc_portchain\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    PROTO_MPLS \u003d \u0027mpls\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    protocol \u003d df_fields.EnumField([PROTO_MPLS])"},{"line_number":100,"context_line":"    chain_id \u003d fields.IntField()"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_1d88771d","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":23},"in_reply_to":"df140735_66575728","updated":"2017-06-29 07:13:08.000000000","message":"I\u0027ve moved it up above in this file.\n\nSince it is quite SFC specific and all SFC modules use this one, I think it is appropriate for now.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c6a5b72c139cf433b9638365f5de8a793ca1850e","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    PROTO_MPLS \u003d \u0027mpls\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    protocol \u003d df_fields.EnumField([PROTO_MPLS])"},{"line_number":100,"context_line":"    chain_id \u003d fields.IntField()"},{"line_number":101,"context_line":"    port_pair_groups \u003d df_fields.ReferenceListField(PortPairGroup)"},{"line_number":102,"context_line":"    flow_classifiers \u003d df_fields.ReferenceListField(FlowClassifier)"}],"source_content_type":"text/x-python","patch_set":19,"id":"df140735_ea43ca3d","line":99,"range":{"start_line":99,"start_character":35,"end_line":99,"end_character":47},"updated":"2017-06-06 07:25:15.000000000","message":"Maybe make a constant?","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f44efea0ae2cc5dbaf35fa98d71e156f6489beda","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    PROTO_MPLS \u003d \u0027mpls\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    protocol \u003d df_fields.EnumField([PROTO_MPLS])"},{"line_number":100,"context_line":"    chain_id \u003d fields.IntField()"},{"line_number":101,"context_line":"    port_pair_groups \u003d df_fields.ReferenceListField(PortPairGroup)"},{"line_number":102,"context_line":"    flow_classifiers \u003d df_fields.ReferenceListField(FlowClassifier)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_7d8e4b28","line":99,"range":{"start_line":99,"start_character":35,"end_line":99,"end_character":47},"in_reply_to":"df140735_ea43ca3d","updated":"2017-06-29 07:13:08.000000000","message":"I can but it is not being used anywhere but here.","commit_id":"9b8e162c2acc50e56c5d5099ba53f6366d60fde1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2f6d96d149f8b072b1852dd440bab61889d95537","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    ingress_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":33,"context_line":"    egress_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":34,"context_line":"    correlation_mechanism \u003d df_fields.EnumField([\u0027none\u0027, \u0027mpls\u0027])"},{"line_number":35,"context_line":"    weight \u003d fields.FloatField()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_3f58dd2e","line":34,"updated":"2017-06-28 13:08:46.000000000","message":"There are many items here that should be made into constants (See PS19)","commit_id":"bb8fc1076ac7c41b4ccecad1432acbeb353a6c00"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0925607838d9592ac00ce8c822219675952ca0e9","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    ingress_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":33,"context_line":"    egress_port \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":34,"context_line":"    correlation_mechanism \u003d df_fields.EnumField([\u0027none\u0027, \u0027mpls\u0027])"},{"line_number":35,"context_line":"    weight \u003d fields.FloatField()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3f1d235d_fdb01b8e","line":34,"in_reply_to":"5f201791_3f58dd2e","updated":"2017-06-29 07:12:54.000000000","message":"Done","commit_id":"bb8fc1076ac7c41b4ccecad1432acbeb353a6c00"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2f6d96d149f8b072b1852dd440bab61889d95537","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    # TODO(dimak) Add l7 parameters"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def is_classification_local(self):"},{"line_number":80,"context_line":"        if self.source_port is not None:"},{"line_number":81,"context_line":"            return self.source_port.is_local"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_5f20399b","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":31},"updated":"2017-06-28 13:08:46.000000000","message":"I am not convinced this implementation is correct. Maybe add a docstring to expalin what you are doing here?","commit_id":"bb8fc1076ac7c41b4ccecad1432acbeb353a6c00"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0925607838d9592ac00ce8c822219675952ca0e9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    # TODO(dimak) Add l7 parameters"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def is_classification_local(self):"},{"line_number":80,"context_line":"        if self.source_port is not None:"},{"line_number":81,"context_line":"            return self.source_port.is_local"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3f1d235d_5de14fd0","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":31},"in_reply_to":"5f201791_5f20399b","updated":"2017-06-29 07:12:54.000000000","message":"Adding a comment","commit_id":"bb8fc1076ac7c41b4ccecad1432acbeb353a6c00"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"7c97ddab8ba85b745c89b2ea696d449c3b1ee513","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \u0027\u0027\u0027Should the flow classifier classification flows be installed locally"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        For classification on source lport, we match using reg6, which is"},{"line_number":98,"context_line":"        available only after classification app set it, so there is no use"},{"line_number":99,"context_line":"        installing it on other hosts."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        For classification on dest lport, we match using reg7, which is set"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_2754a7fe","line":98,"range":{"start_line":98,"start_character":47,"end_line":98,"end_character":52},"updated":"2017-07-05 08:37:19.000000000","message":"sets","commit_id":"2afdd03169c3f3bfea3a73afaa2d43089fe60b70"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"2632c7386b4653176dbe82f5a93ca27fb009aaf7","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \u0027\u0027\u0027Should the flow classifier classification flows be installed locally"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        For classification on source lport, we match using reg6, which is"},{"line_number":98,"context_line":"        available only after classification app set it, so there is no use"},{"line_number":99,"context_line":"        installing it on other hosts."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        For classification on dest lport, we match using reg7, which is set"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_b7a57e49","line":98,"range":{"start_line":98,"start_character":47,"end_line":98,"end_character":52},"in_reply_to":"3f1d235d_2754a7fe","updated":"2017-07-05 11:47:04.000000000","message":"Done","commit_id":"2afdd03169c3f3bfea3a73afaa2d43089fe60b70"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"7c97ddab8ba85b745c89b2ea696d449c3b1ee513","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        installing it on other hosts."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        For classification on dest lport, we match using reg7, which is set"},{"line_number":102,"context_line":"        on any host doing L2 for the packet. We can classify the packet right"},{"line_number":103,"context_line":"        away on any of the hosts and forward it to the first SF, saving 2 hops"},{"line_number":104,"context_line":"        of going to dest node then to the first SF."},{"line_number":105,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_076e4bc8","line":102,"range":{"start_line":102,"start_character":20,"end_line":102,"end_character":29},"updated":"2017-07-05 08:37:19.000000000","message":"what does it mean \u0027doing l2\u0027?","commit_id":"2afdd03169c3f3bfea3a73afaa2d43089fe60b70"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"2632c7386b4653176dbe82f5a93ca27fb009aaf7","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        installing it on other hosts."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        For classification on dest lport, we match using reg7, which is set"},{"line_number":102,"context_line":"        on any host doing L2 for the packet. We can classify the packet right"},{"line_number":103,"context_line":"        away on any of the hosts and forward it to the first SF, saving 2 hops"},{"line_number":104,"context_line":"        of going to dest node then to the first SF."},{"line_number":105,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_776926f7","line":102,"range":{"start_line":102,"start_character":20,"end_line":102,"end_character":29},"in_reply_to":"3f1d235d_076e4bc8","updated":"2017-07-05 11:47:04.000000000","message":"Done","commit_id":"2afdd03169c3f3bfea3a73afaa2d43089fe60b70"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"7c97ddab8ba85b745c89b2ea696d449c3b1ee513","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        For classification on source lport, we match using reg6, so we can"},{"line_number":116,"context_line":"        dispatch the packet anywhere, and it will be forwarded. No loop will be"},{"line_number":117,"context_line":"        created because no one will set reg6 again."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        For classification on dest lport, we match using reg7, so we have to"},{"line_number":120,"context_line":"        forward the packet all the way to the destination host, and mark it"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_c7de136c","line":117,"range":{"start_line":117,"start_character":23,"end_line":117,"end_character":30},"updated":"2017-07-05 08:37:19.000000000","message":"no app?","commit_id":"2afdd03169c3f3bfea3a73afaa2d43089fe60b70"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"2632c7386b4653176dbe82f5a93ca27fb009aaf7","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        For classification on source lport, we match using reg6, so we can"},{"line_number":116,"context_line":"        dispatch the packet anywhere, and it will be forwarded. No loop will be"},{"line_number":117,"context_line":"        created because no one will set reg6 again."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        For classification on dest lport, we match using reg7, so we have to"},{"line_number":120,"context_line":"        forward the packet all the way to the destination host, and mark it"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_576aaaec","line":117,"range":{"start_line":117,"start_character":23,"end_line":117,"end_character":30},"in_reply_to":"3f1d235d_c7de136c","updated":"2017-07-05 11:47:04.000000000","message":"Done","commit_id":"2afdd03169c3f3bfea3a73afaa2d43089fe60b70"}],"dragonflow/db/models/sfc_models.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d6b50f043f9e58ffd360994b7a38a98a6109829b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"9a30ddce_96c7bb44","updated":"2017-03-07 12:31:29.000000000","message":"Please rename to sfc.py.","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"05a42e0605cf89b9e01e1f0ae157f40bec55d1e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"9a30ddce_955e9ae7","in_reply_to":"9a30ddce_96c7bb44","updated":"2017-03-08 13:14:15.000000000","message":"Done","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"69809e9de2a2584a0e3e18d30352d475d6a8ec32","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               mixins.Name):"},{"line_number":29,"context_line":"    table_name \u003d \u0027sfc_portpair\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    ingress_port \u003d fields.StringField(required\u003dTrue)"},{"line_number":32,"context_line":"    egress_port \u003d fields.StringField(required\u003dTrue)"},{"line_number":33,"context_line":"    correlation_mechanism \u003d df_fields.EnumField([\u0027mpls\u0027])"},{"line_number":34,"context_line":"    weight \u003d fields.FloatField()"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_f3672e23","line":32,"range":{"start_line":31,"start_character":0,"end_line":32,"end_character":51},"updated":"2017-03-07 10:29:55.000000000","message":"Will these be references to LogicalPorts once its migrated? If so, a TODO/FIXME is needed.","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"05a42e0605cf89b9e01e1f0ae157f40bec55d1e1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               mixins.Name):"},{"line_number":29,"context_line":"    table_name \u003d \u0027sfc_portpair\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    ingress_port \u003d fields.StringField(required\u003dTrue)"},{"line_number":32,"context_line":"    egress_port \u003d fields.StringField(required\u003dTrue)"},{"line_number":33,"context_line":"    correlation_mechanism \u003d df_fields.EnumField([\u0027mpls\u0027])"},{"line_number":34,"context_line":"    weight \u003d fields.FloatField()"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_d55812fd","line":32,"range":{"start_line":31,"start_character":0,"end_line":32,"end_character":51},"in_reply_to":"9a30ddce_f3672e23","updated":"2017-03-08 13:14:15.000000000","message":"Will add","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"69809e9de2a2584a0e3e18d30352d475d6a8ec32","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                     mixins.UniqueKey):"},{"line_number":64,"context_line":"    table_name \u003d \u0027sfc_flowclassifier\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    ether_type \u003d fields.StringField()"},{"line_number":67,"context_line":"    protocol \u003d fields.StringField()"},{"line_number":68,"context_line":"    source_cidr \u003d df_fields.IpNetworkField()"},{"line_number":69,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":70,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_ae1aad6c","line":67,"range":{"start_line":66,"start_character":0,"end_line":67,"end_character":35},"updated":"2017-03-07 10:29:55.000000000","message":"Can these be Enum fields?","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"05a42e0605cf89b9e01e1f0ae157f40bec55d1e1","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                     mixins.UniqueKey):"},{"line_number":64,"context_line":"    table_name \u003d \u0027sfc_flowclassifier\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    ether_type \u003d fields.StringField()"},{"line_number":67,"context_line":"    protocol \u003d fields.StringField()"},{"line_number":68,"context_line":"    source_cidr \u003d df_fields.IpNetworkField()"},{"line_number":69,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":70,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_556d0297","line":67,"range":{"start_line":66,"start_character":0,"end_line":67,"end_character":35},"in_reply_to":"9a30ddce_ae1aad6c","updated":"2017-03-08 13:14:15.000000000","message":"Yeah, will adapt","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"69809e9de2a2584a0e3e18d30352d475d6a8ec32","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":70,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"},{"line_number":71,"context_line":"    dest_transport_ports \u003d df_fields.PortRangeField()"},{"line_number":72,"context_line":"    source_port_id \u003d fields.StringField()"},{"line_number":73,"context_line":"    dest_port_id \u003d fields.StringField()"},{"line_number":74,"context_line":"    # l7 parameters"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_ee03c50b","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":39},"updated":"2017-03-07 10:29:55.000000000","message":"Same here regarding LogicalPort references?","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"05a42e0605cf89b9e01e1f0ae157f40bec55d1e1","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":70,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"},{"line_number":71,"context_line":"    dest_transport_ports \u003d df_fields.PortRangeField()"},{"line_number":72,"context_line":"    source_port_id \u003d fields.StringField()"},{"line_number":73,"context_line":"    dest_port_id \u003d fields.StringField()"},{"line_number":74,"context_line":"    # l7 parameters"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a30ddce_75684688","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":39},"in_reply_to":"9a30ddce_ee03c50b","updated":"2017-03-08 13:14:15.000000000","message":"Will add FIXME","commit_id":"73191997d7ce9c9347a1bc17c94e92725ee77c40"}],"dragonflow/db/models_sfc.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"daf79cb44e69caa4abf21609a5420652e26963cf","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                     models.UniqueKeyMixin):"},{"line_number":51,"context_line":"    table_name \u003d \u0027sfc_flowclassifier\u0027"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    ether_type \u003d fields.StringField()"},{"line_number":54,"context_line":"    protocol \u003d fields.StringField()"},{"line_number":55,"context_line":"    source_cidr \u003d df_fields.IpNetworkField()"},{"line_number":56,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_bdc23432","line":53,"range":{"start_line":53,"start_character":0,"end_line":53,"end_character":37},"updated":"2017-02-08 09:24:29.000000000","message":"This can only be IPv4, IPv6, NSH, and MPLS, no?\nMaybe make it an enum field?","commit_id":"c2aba4d6b476eae3a2b2611ef07b0845d1e349b2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"daf79cb44e69caa4abf21609a5420652e26963cf","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    table_name \u003d \u0027sfc_flowclassifier\u0027"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    ether_type \u003d fields.StringField()"},{"line_number":54,"context_line":"    protocol \u003d fields.StringField()"},{"line_number":55,"context_line":"    source_cidr \u003d df_fields.IpNetworkField()"},{"line_number":56,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":57,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_9dd018f8","line":54,"range":{"start_line":54,"start_character":0,"end_line":54,"end_character":35},"updated":"2017-02-08 09:24:29.000000000","message":"What kind of protocol is this? Maybe change the name to be more descriptive? (e.g. ip_protocol if relevant)","commit_id":"c2aba4d6b476eae3a2b2611ef07b0845d1e349b2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"daf79cb44e69caa4abf21609a5420652e26963cf","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    dest_cidr \u003d df_fields.IpNetworkField()"},{"line_number":57,"context_line":"    source_transport_ports \u003d df_fields.PortRangeField()"},{"line_number":58,"context_line":"    dest_transport_ports \u003d df_fields.PortRangeField()"},{"line_number":59,"context_line":"    source_port_id \u003d fields.StringField()"},{"line_number":60,"context_line":"    dest_port_id \u003d fields.StringField()"},{"line_number":61,"context_line":"    # l7 parameters"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_7dcc4c6a","line":60,"range":{"start_line":59,"start_character":0,"end_line":60,"end_character":39},"updated":"2017-02-08 09:24:29.000000000","message":"Aren\u0027t these lport references?","commit_id":"c2aba4d6b476eae3a2b2611ef07b0845d1e349b2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"daf79cb44e69caa4abf21609a5420652e26963cf","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                models.NameMixin):"},{"line_number":70,"context_line":"    table_name \u003d \u0027sfc_portchain\u0027"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    PROTO_MPLS \u003d \u0027mpls\u0027"},{"line_number":73,"context_line":"    PROTO_NSH \u003d \u0027nsh\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    protocol \u003d df_fields.EnumField([PROTO_MPLS, PROTO_NSH])"},{"line_number":76,"context_line":"    chain_id \u003d fields.IntField()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_7d41aca8","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":21},"updated":"2017-02-08 09:24:29.000000000","message":"Maybe make these module-global, rather than class-global?","commit_id":"c2aba4d6b476eae3a2b2611ef07b0845d1e349b2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"daf79cb44e69caa4abf21609a5420652e26963cf","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    flow_classifiers \u003d df_fields.ReferenceListField(FlowClassifier)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def get_mpls_ingress_label(self, fc_idx, hop_idx):"},{"line_number":81,"context_line":"        # FIXME:"},{"line_number":82,"context_line":"        return hop_idx | (fc_idx \u003c\u003c 8) | (self.chain_id \u003c\u003c 11)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def get_mpls_egress_label(self, fc_idx, hop_idx):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_5d0f9087","line":81,"range":{"start_line":81,"start_character":0,"end_line":81,"end_character":16},"updated":"2017-02-08 09:24:29.000000000","message":"This comment is incomplete","commit_id":"c2aba4d6b476eae3a2b2611ef07b0845d1e349b2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"daf79cb44e69caa4abf21609a5420652e26963cf","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def get_mpls_ingress_label(self, fc_idx, hop_idx):"},{"line_number":81,"context_line":"        # FIXME:"},{"line_number":82,"context_line":"        return hop_idx | (fc_idx \u003c\u003c 8) | (self.chain_id \u003c\u003c 11)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def get_mpls_egress_label(self, fc_idx, hop_idx):"},{"line_number":85,"context_line":"        return self.get_mpls_ingress_label(fc_idx, hop_idx + 1)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_5d5dd077","line":82,"updated":"2017-02-08 09:24:29.000000000","message":"Do you want to verify that hop_idx, fc_idx, and chain_id aren\u0027t over-flowing?","commit_id":"c2aba4d6b476eae3a2b2611ef07b0845d1e349b2"}]}
