)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"eb64df8198e0127eb90d89d3bdc7904126ae0442","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dima Kuznetsov \u003cdima.kuznetsov@toganetworks.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-07-05 22:13:57 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[04/xx] Introduce SFC forwaring app"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch introduces forwarding app for SFC, see API at [1] for"},{"line_number":10,"context_line":"more information."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"3f1d235d_73a59746","line":7,"range":{"start_line":7,"start_character":22,"end_line":7,"end_character":31},"updated":"2017-07-06 07:27:23.000000000","message":"forwarding (in next respin)","commit_id":"862f79f54b8aea1f383ce580b56f8ba337aa088c"}],"dragonflow/controller/apps/sfc.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        model_const.EVENT_UPDATED,"},{"line_number":51,"context_line":"    )"},{"line_number":52,"context_line":"    def _sfc_portpairgroup_updated(self, ppg, old_ppg):"},{"line_number":53,"context_line":"        pc \u003d self._pc_by_ppg(ppg)"},{"line_number":54,"context_line":"        if pc is None:"},{"line_number":55,"context_line":"            return"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_e1605f38","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":10},"updated":"2017-07-09 11:53:18.000000000","message":"Maybe rename: pc -\u003e port_chain ? (Throughout this file)","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        model_const.EVENT_UPDATED,"},{"line_number":51,"context_line":"    )"},{"line_number":52,"context_line":"    def _sfc_portpairgroup_updated(self, ppg, old_ppg):"},{"line_number":53,"context_line":"        pc \u003d self._pc_by_ppg(ppg)"},{"line_number":54,"context_line":"        if pc is None:"},{"line_number":55,"context_line":"            return"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_b71745a4","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":10},"in_reply_to":"3f1d235d_e1605f38","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        driver.uninstall_dispatch_to_ppg_flows(pc, old_ppg)"},{"line_number":60,"context_line":"        driver.install_dispatch_to_ppg_flows(pc, ppg)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        for old_pp, new_pp in itertools.izip_longest("},{"line_number":63,"context_line":"            ppg.port_pairs,"},{"line_number":64,"context_line":"            old_ppg.port_pairs,"},{"line_number":65,"context_line":"        ):"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_81708bde","line":62,"range":{"start_line":62,"start_character":12,"end_line":62,"end_character":18},"updated":"2017-07-09 11:53:18.000000000","message":"Maybe rename: \\(.*_?\\)pp -\u003e \\1port_pair ? (Throughout this file)","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        driver.uninstall_dispatch_to_ppg_flows(pc, old_ppg)"},{"line_number":60,"context_line":"        driver.install_dispatch_to_ppg_flows(pc, ppg)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        for old_pp, new_pp in itertools.izip_longest("},{"line_number":63,"context_line":"            ppg.port_pairs,"},{"line_number":64,"context_line":"            old_ppg.port_pairs,"},{"line_number":65,"context_line":"        ):"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_3768d51f","line":62,"range":{"start_line":62,"start_character":12,"end_line":62,"end_character":18},"in_reply_to":"3f1d235d_81708bde","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        for fc in pc.flow_classifiers:"},{"line_number":131,"context_line":"            self._remove_flow_classifier(pc, fc)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        for ppg in pc.port_pair_groups:"},{"line_number":134,"context_line":"            self._remove_port_pair_group(pc, ppg)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @df_base_app.register_event(sfc.PortChain, model_const.EVENT_UPDATED)"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_e14a9f81","line":133,"range":{"start_line":133,"start_character":12,"end_line":133,"end_character":15},"updated":"2017-07-09 11:53:18.000000000","message":"Maybe rename: ppg -\u003e port_pair_group ? (Throughout this file)","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        for fc in pc.flow_classifiers:"},{"line_number":131,"context_line":"            self._remove_flow_classifier(pc, fc)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        for ppg in pc.port_pair_groups:"},{"line_number":134,"context_line":"            self._remove_port_pair_group(pc, ppg)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @df_base_app.register_event(sfc.PortChain, model_const.EVENT_UPDATED)"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_1775d9fa","line":133,"range":{"start_line":133,"start_character":12,"end_line":133,"end_character":15},"in_reply_to":"3f1d235d_e14a9f81","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        added_fc_ids \u003d new_fc_ids - old_fc_ids"},{"line_number":141,"context_line":"        removed_fc_ids \u003d old_fc_ids - new_fc_ids"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        removed_fcs \u003d ["},{"line_number":144,"context_line":"            fc for fc in old_pc.flow_classifiers if fc in removed_fc_ids"},{"line_number":145,"context_line":"        ]"},{"line_number":146,"context_line":"        for fc in removed_fcs:"},{"line_number":147,"context_line":"            self._remove_flow_classifier(pc, fc)"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_c14fa390","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":9},"updated":"2017-07-09 11:53:18.000000000","message":"Maybe make a generator, not a list?","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        added_fc_ids \u003d new_fc_ids - old_fc_ids"},{"line_number":141,"context_line":"        removed_fc_ids \u003d old_fc_ids - new_fc_ids"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        removed_fcs \u003d ["},{"line_number":144,"context_line":"            fc for fc in old_pc.flow_classifiers if fc in removed_fc_ids"},{"line_number":145,"context_line":"        ]"},{"line_number":146,"context_line":"        for fc in removed_fcs:"},{"line_number":147,"context_line":"            self._remove_flow_classifier(pc, fc)"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_d7608138","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":9},"in_reply_to":"3f1d235d_c14fa390","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        for fc in removed_fcs:"},{"line_number":147,"context_line":"            self._remove_flow_classifier(pc, fc)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        added_fcs \u003d ["},{"line_number":150,"context_line":"            fc for fc in pc.flow_classifiers if fc.id in added_fc_ids"},{"line_number":151,"context_line":"        ]"},{"line_number":152,"context_line":"        for fc in added_fcs:"},{"line_number":153,"context_line":"            self._add_flow_classifier(pc, fc)"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_a144a775","line":151,"range":{"start_line":149,"start_character":0,"end_line":151,"end_character":9},"updated":"2017-07-09 11:53:18.000000000","message":"Same, re: generator vs. list?","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        for fc in removed_fcs:"},{"line_number":147,"context_line":"            self._remove_flow_classifier(pc, fc)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        added_fcs \u003d ["},{"line_number":150,"context_line":"            fc for fc in pc.flow_classifiers if fc.id in added_fc_ids"},{"line_number":151,"context_line":"        ]"},{"line_number":152,"context_line":"        for fc in added_fcs:"},{"line_number":153,"context_line":"            self._add_flow_classifier(pc, fc)"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_b7650548","line":151,"range":{"start_line":149,"start_character":0,"end_line":151,"end_character":9},"in_reply_to":"3f1d235d_a144a775","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        ):"},{"line_number":182,"context_line":"            yield fc"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _get_relevant_pps(self, lport):"},{"line_number":185,"context_line":"        return self.db_store.get_all("},{"line_number":186,"context_line":"            sfc.PortPair(egress_port\u003dlport),"},{"line_number":187,"context_line":"            index\u003dsfc.PortPair.get_index(\u0027egress\u0027),"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_21589754","line":184,"range":{"start_line":184,"start_character":22,"end_line":184,"end_character":25},"updated":"2017-07-09 11:53:18.000000000","message":"Maybe rename to _get_relevant_port_pairs?","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        ):"},{"line_number":182,"context_line":"            yield fc"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _get_relevant_pps(self, lport):"},{"line_number":185,"context_line":"        return self.db_store.get_all("},{"line_number":186,"context_line":"            sfc.PortPair(egress_port\u003dlport),"},{"line_number":187,"context_line":"            index\u003dsfc.PortPair.get_index(\u0027egress\u0027),"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_975a0981","line":184,"range":{"start_line":184,"start_character":22,"end_line":184,"end_character":25},"in_reply_to":"3f1d235d_21589754","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"001ccac48fb2fbccc58713fabc00d1c386f92cd6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.initialize()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def initialize(self):"},{"line_number":32,"context_line":"        self.mpls_driver \u003d sfc_mpls_driver.MplsDriver(self)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _get_port_chain_driver(self, port_chain):"},{"line_number":35,"context_line":"        proto \u003d port_chain.protocol"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_19760408","line":32,"range":{"start_line":32,"start_character":7,"end_line":32,"end_character":59},"updated":"2017-07-11 05:30:17.000000000","message":"Why is this hard coded?","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"7a37c2a4f4c38b6faa01c094286fc3517e216cc0","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.initialize()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def initialize(self):"},{"line_number":32,"context_line":"        self.mpls_driver \u003d sfc_mpls_driver.MplsDriver(self)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _get_port_chain_driver(self, port_chain):"},{"line_number":35,"context_line":"        proto \u003d port_chain.protocol"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_c2d9ac22","line":32,"range":{"start_line":32,"start_character":7,"end_line":32,"end_character":59},"in_reply_to":"3f1d235d_19760408","updated":"2017-07-11 13:57:22.000000000","message":"We only support one driver at the moment, we can add dynamic registration with stevedore if that\u0027s something someone will actually need.","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"8ecf8d7092bb65e0f4640b6438220aa895e0fe80","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.initialize()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def initialize(self):"},{"line_number":32,"context_line":"        self.mpls_driver \u003d sfc_mpls_driver.MplsDriver(self)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _get_port_chain_driver(self, port_chain):"},{"line_number":35,"context_line":"        proto \u003d port_chain.protocol"}],"source_content_type":"text/x-python","patch_set":36,"id":"1f1a1f67_a0a3774f","line":32,"range":{"start_line":32,"start_character":7,"end_line":32,"end_character":59},"in_reply_to":"3f1d235d_c2d9ac22","updated":"2017-07-13 06:31:44.000000000","message":"Agreed. I just had in mind stevedore-like loading with Mpls driver as default one","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"001ccac48fb2fbccc58713fabc00d1c386f92cd6","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            )"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @df_base_app.register_event(sfc.PortPairGroup, model_const.EVENT_UPDATED)"},{"line_number":44,"context_line":"    def _port_pair_group_updated(self, port_pair_group, old_port_pair_group):"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        port_chain \u003d self._port_chain_by_port_pair_group("},{"line_number":47,"context_line":"            port_pair_group,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_b9c95026","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":32},"updated":"2017-07-11 05:30:17.000000000","message":"please add docstring","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"7a37c2a4f4c38b6faa01c094286fc3517e216cc0","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            )"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @df_base_app.register_event(sfc.PortPairGroup, model_const.EVENT_UPDATED)"},{"line_number":44,"context_line":"    def _port_pair_group_updated(self, port_pair_group, old_port_pair_group):"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        port_chain \u003d self._port_chain_by_port_pair_group("},{"line_number":47,"context_line":"            port_pair_group,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_c9442c4a","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":32},"in_reply_to":"3f1d235d_b9c95026","updated":"2017-07-11 13:57:22.000000000","message":"Done","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"001ccac48fb2fbccc58713fabc00d1c386f92cd6","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            self._remove_port_pair_group(port_chain, ppg)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @df_base_app.register_event(sfc.PortChain, model_const.EVENT_UPDATED)"},{"line_number":162,"context_line":"    def _port_chain_updated(self, port_chain, old_port_chain):"},{"line_number":163,"context_line":"        driver \u003d self._get_port_chain_driver(port_chain)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        old_fc_ids \u003d set(fc.id for fc in old_port_chain.flow_classifiers)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_59035c43","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":26},"updated":"2017-07-11 05:30:17.000000000","message":"please add docstring. What kind of updates is supported?","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"8ecf8d7092bb65e0f4640b6438220aa895e0fe80","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            self._remove_port_pair_group(port_chain, ppg)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @df_base_app.register_event(sfc.PortChain, model_const.EVENT_UPDATED)"},{"line_number":162,"context_line":"    def _port_chain_updated(self, port_chain, old_port_chain):"},{"line_number":163,"context_line":"        driver \u003d self._get_port_chain_driver(port_chain)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        old_fc_ids \u003d set(fc.id for fc in old_port_chain.flow_classifiers)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1f1a1f67_a0bc9769","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":26},"in_reply_to":"3f1d235d_49a7fc0c","updated":"2017-07-13 06:31:44.000000000","message":"agreed","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"7a37c2a4f4c38b6faa01c094286fc3517e216cc0","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            self._remove_port_pair_group(port_chain, ppg)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @df_base_app.register_event(sfc.PortChain, model_const.EVENT_UPDATED)"},{"line_number":162,"context_line":"    def _port_chain_updated(self, port_chain, old_port_chain):"},{"line_number":163,"context_line":"        driver \u003d self._get_port_chain_driver(port_chain)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        old_fc_ids \u003d set(fc.id for fc in old_port_chain.flow_classifiers)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_49a7fc0c","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":26},"in_reply_to":"3f1d235d_59035c43","updated":"2017-07-11 13:57:22.000000000","message":"Done, I would note hover that this kind of info is best looked up in the API docs, rather than on the docstring of an agent function..","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"001ccac48fb2fbccc58713fabc00d1c386f92cd6","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return None, None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_CREATED)"},{"line_number":260,"context_line":"    def _local_lport_created(self, lport):"},{"line_number":261,"context_line":"        # install new encap/decap flows"},{"line_number":262,"context_line":"        for fc in self._flow_classifiers_by_lport(lport):"},{"line_number":263,"context_line":"            port_chain \u003d self._port_chain_by_flow_classifier(fc)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_f98c68d8","line":260,"range":{"start_line":260,"start_character":8,"end_line":260,"end_character":28},"updated":"2017-07-11 05:30:17.000000000","message":"docstring","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"7a37c2a4f4c38b6faa01c094286fc3517e216cc0","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return None, None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_CREATED)"},{"line_number":260,"context_line":"    def _local_lport_created(self, lport):"},{"line_number":261,"context_line":"        # install new encap/decap flows"},{"line_number":262,"context_line":"        for fc in self._flow_classifiers_by_lport(lport):"},{"line_number":263,"context_line":"            port_chain \u003d self._port_chain_by_flow_classifier(fc)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_29ae00e7","line":260,"range":{"start_line":260,"start_character":8,"end_line":260,"end_character":28},"in_reply_to":"3f1d235d_f98c68d8","updated":"2017-07-11 13:57:22.000000000","message":"Done","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"001ccac48fb2fbccc58713fabc00d1c386f92cd6","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                    )"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_DELETED)"},{"line_number":293,"context_line":"    def _local_lport_deleted(self, lport):"},{"line_number":294,"context_line":"        for fc in self._flow_classifiers_by_lport(lport):"},{"line_number":295,"context_line":"            port_chain \u003d self._port_chain_by_flow_classifier(fc)"},{"line_number":296,"context_line":"            if port_chain is not None:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_d9bd2c69","line":293,"range":{"start_line":293,"start_character":7,"end_line":293,"end_character":27},"updated":"2017-07-11 05:30:17.000000000","message":"ditto","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"7a37c2a4f4c38b6faa01c094286fc3517e216cc0","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                    )"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_DELETED)"},{"line_number":293,"context_line":"    def _local_lport_deleted(self, lport):"},{"line_number":294,"context_line":"        for fc in self._flow_classifiers_by_lport(lport):"},{"line_number":295,"context_line":"            port_chain \u003d self._port_chain_by_flow_classifier(fc)"},{"line_number":296,"context_line":"            if port_chain is not None:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_e9b7e839","line":293,"range":{"start_line":293,"start_character":7,"end_line":293,"end_character":27},"in_reply_to":"3f1d235d_d9bd2c69","updated":"2017-07-11 13:57:22.000000000","message":"Done","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"0a5b75292c50571144674e6ba1beb6c2e80bb06c","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            port_pair_group.port_pairs,"},{"line_number":68,"context_line":"            old_port_pair_group.port_pairs,"},{"line_number":69,"context_line":"        ):"},{"line_number":70,"context_line":"            if old_pp is not None and new_pp is None:"},{"line_number":71,"context_line":"                self._uninstall_port_pair_egress("},{"line_number":72,"context_line":"                    port_chain,"},{"line_number":73,"context_line":"                    old_port_pair_group,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_d62fc785","line":70,"updated":"2017-07-18 14:27:07.000000000","message":"why not : \n---------\nif  old_pp and new_pp and old_pp.id \u003d\u003d new_pp.id \n  continue \nif new-pp:\n    isntall new\nif old-pp:\n    uninstall old","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"29faa3f646792b225301b22d6af71a2a2c56661d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            port_pair_group.port_pairs,"},{"line_number":68,"context_line":"            old_port_pair_group.port_pairs,"},{"line_number":69,"context_line":"        ):"},{"line_number":70,"context_line":"            if old_pp is not None and new_pp is None:"},{"line_number":71,"context_line":"                self._uninstall_port_pair_egress("},{"line_number":72,"context_line":"                    port_chain,"},{"line_number":73,"context_line":"                    old_port_pair_group,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_9c4369b0","line":70,"in_reply_to":"1f1a1f67_d62fc785","updated":"2017-07-20 07:03:30.000000000","message":"I\u0027ll try to test that and see if I can make it shorter. Thanks :)","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"0a5b75292c50571144674e6ba1beb6c2e80bb06c","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    old_pp,"},{"line_number":94,"context_line":"                )"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _add_port_pair_group(self, port_chain, port_pair_group):"},{"line_number":97,"context_line":"        driver \u003d self._get_port_chain_driver(port_chain)"},{"line_number":98,"context_line":"        driver.install_port_pair_group_flows("},{"line_number":99,"context_line":"            port_chain,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_56029770","line":96,"updated":"2017-07-18 14:27:07.000000000","message":"Mabey forward the driver as parameter?\n(Relevant for all methods that not decorated with register event..)","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"29faa3f646792b225301b22d6af71a2a2c56661d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    old_pp,"},{"line_number":94,"context_line":"                )"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _add_port_pair_group(self, port_chain, port_pair_group):"},{"line_number":97,"context_line":"        driver \u003d self._get_port_chain_driver(port_chain)"},{"line_number":98,"context_line":"        driver.install_port_pair_group_flows("},{"line_number":99,"context_line":"            port_chain,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_3cb0d5dd","line":96,"in_reply_to":"1f1a1f67_56029770","updated":"2017-07-20 07:03:30.000000000","message":"I think it creates more clutter in the code than the cpu time it saves..","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"8506281f3833c68896a08d369c0625000cbcb069","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                    self._port_chain_with_port_pair_group_by_port_pair(pp)"},{"line_number":278,"context_line":"            if port_chain is not None:"},{"line_number":279,"context_line":"                driver \u003d self._get_port_chain_driver(port_chain)"},{"line_number":280,"context_line":"                if lport.id \u003d\u003d pp.egress_port.id:"},{"line_number":281,"context_line":"                    driver.install_port_pair_egress_flows("},{"line_number":282,"context_line":"                        port_chain,"},{"line_number":283,"context_line":"                        port_pair_group,"}],"source_content_type":"text/x-python","patch_set":41,"id":"1f1a1f67_683447fc","line":280,"updated":"2017-07-24 15:15:28.000000000","message":"isn\u0027t old egress flow should deleted?","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6cbf84826499d71b6e019db8914ad41f0e32d704","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                    self._port_chain_with_port_pair_group_by_port_pair(pp)"},{"line_number":278,"context_line":"            if port_chain is not None:"},{"line_number":279,"context_line":"                driver \u003d self._get_port_chain_driver(port_chain)"},{"line_number":280,"context_line":"                if lport.id \u003d\u003d pp.egress_port.id:"},{"line_number":281,"context_line":"                    driver.install_port_pair_egress_flows("},{"line_number":282,"context_line":"                        port_chain,"},{"line_number":283,"context_line":"                        port_pair_group,"}],"source_content_type":"text/x-python","patch_set":41,"id":"ff346bd7_51959ce3","line":280,"in_reply_to":"1f1a1f67_683447fc","updated":"2017-07-24 19:25:41.000000000","message":"This is a port created handler, there shouldn\u0027t be old egress flows if the port was just added.","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"}],"dragonflow/controller/apps/sfc_driver_base.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"f5003a2c1420ab6b95342f1a167d2b742b10736f","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":20,"context_line":"class SfcBaseDriver(object):"},{"line_number":21,"context_line":"    def __init__(self, app):"},{"line_number":22,"context_line":"        pass"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @abc.abstractmethod"},{"line_number":25,"context_line":"    def install_flow_classifier_flows(self, port_chain, flow_classifier):"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_9c329b5d","line":22,"range":{"start_line":21,"start_character":0,"end_line":22,"end_character":12},"updated":"2017-07-18 08:08:39.000000000","message":"Is this needed?","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"996b5b83988dea3e3855568c082957dd0fa7b9d2","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":20,"context_line":"class SfcBaseDriver(object):"},{"line_number":21,"context_line":"    def __init__(self, app):"},{"line_number":22,"context_line":"        pass"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @abc.abstractmethod"},{"line_number":25,"context_line":"    def install_flow_classifier_flows(self, port_chain, flow_classifier):"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_6dadcb99","line":22,"range":{"start_line":21,"start_character":0,"end_line":22,"end_character":12},"in_reply_to":"1f1a1f67_9c329b5d","updated":"2017-07-18 09:41:45.000000000","message":"Part of the interface","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"}],"dragonflow/controller/apps/sfc_mpls_driver.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def __init__(self, app):"},{"line_number":32,"context_line":"        self.app \u003d app"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def _create_label(cls, chain_idx, fc_idx, ppg_idx):"},{"line_number":36,"context_line":"        return ppg_idx | (fc_idx \u003c\u003c 8) | (chain_idx \u003c\u003c 11)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def _get_ingress_label(cls, pc, fc, ppg):"},{"line_number":40,"context_line":"        fc_idx \u003d _get_index_by_id(pc.flow_classifiers, fc)"},{"line_number":41,"context_line":"        ppg_idx \u003d _get_index_by_id(pc.port_pair_groups, ppg)"},{"line_number":42,"context_line":"        return cls._create_label(pc.chain_id, fc_idx, ppg_idx)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def _get_egress_label(cls, pc, fc, ppg):"},{"line_number":46,"context_line":"        return cls._get_ingress_label(pc, fc, ppg) + 1"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def _get_encap_label(cls, pc, fc):"},{"line_number":50,"context_line":"        # Can be done faster but this reads better"},{"line_number":51,"context_line":"        return cls._get_ingress_label(pc, fc, pc.port_pair_groups[0])"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @classmethod"},{"line_number":54,"context_line":"    def _get_decap_label(cls, pc, fc):"},{"line_number":55,"context_line":"        # Same here"},{"line_number":56,"context_line":"        return cls._get_egress_label(pc, fc, pc.port_pair_groups[-1])"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def install_encap_flows(self, pc, fc):"},{"line_number":59,"context_line":"        for eth_type in self._ETH_TYPE_TO_TC:"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_a1126761","line":56,"range":{"start_line":34,"start_character":0,"end_line":56,"end_character":69},"updated":"2017-07-09 11:53:18.000000000","message":"Why class methods and not static/module functions? If it\u0027s to allow overriding, why not create a \u0027Label Manager\u0027 and support overriding using composition?","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def __init__(self, app):"},{"line_number":32,"context_line":"        self.app \u003d app"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def _create_label(cls, chain_idx, fc_idx, ppg_idx):"},{"line_number":36,"context_line":"        return ppg_idx | (fc_idx \u003c\u003c 8) | (chain_idx \u003c\u003c 11)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def _get_ingress_label(cls, pc, fc, ppg):"},{"line_number":40,"context_line":"        fc_idx \u003d _get_index_by_id(pc.flow_classifiers, fc)"},{"line_number":41,"context_line":"        ppg_idx \u003d _get_index_by_id(pc.port_pair_groups, ppg)"},{"line_number":42,"context_line":"        return cls._create_label(pc.chain_id, fc_idx, ppg_idx)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def _get_egress_label(cls, pc, fc, ppg):"},{"line_number":46,"context_line":"        return cls._get_ingress_label(pc, fc, ppg) + 1"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def _get_encap_label(cls, pc, fc):"},{"line_number":50,"context_line":"        # Can be done faster but this reads better"},{"line_number":51,"context_line":"        return cls._get_ingress_label(pc, fc, pc.port_pair_groups[0])"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @classmethod"},{"line_number":54,"context_line":"    def _get_decap_label(cls, pc, fc):"},{"line_number":55,"context_line":"        # Same here"},{"line_number":56,"context_line":"        return cls._get_egress_label(pc, fc, pc.port_pair_groups[-1])"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def install_encap_flows(self, pc, fc):"},{"line_number":59,"context_line":"        for eth_type in self._ETH_TYPE_TO_TC:"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_3751f563","line":56,"range":{"start_line":34,"start_character":0,"end_line":56,"end_character":69},"in_reply_to":"3f1d235d_a1126761","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # Same here"},{"line_number":56,"context_line":"        return cls._get_egress_label(pc, fc, pc.port_pair_groups[-1])"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def install_encap_flows(self, pc, fc):"},{"line_number":59,"context_line":"        for eth_type in self._ETH_TYPE_TO_TC:"},{"line_number":60,"context_line":"            self.app.mod_flow("},{"line_number":61,"context_line":"                table_id\u003dconstants.SFC_ENCAP_TABLE,"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_dcfd4809","line":58,"updated":"2017-07-09 11:53:18.000000000","message":"All these external methods are going to need documentation, either here or in an extracted parent class/interface. This is to allow reviewers to understand what the method should do, and future driver developers to understand what to implement.","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # Same here"},{"line_number":56,"context_line":"        return cls._get_egress_label(pc, fc, pc.port_pair_groups[-1])"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def install_encap_flows(self, pc, fc):"},{"line_number":59,"context_line":"        for eth_type in self._ETH_TYPE_TO_TC:"},{"line_number":60,"context_line":"            self.app.mod_flow("},{"line_number":61,"context_line":"                table_id\u003dconstants.SFC_ENCAP_TABLE,"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_37d695c5","line":58,"in_reply_to":"3f1d235d_dcfd4809","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                table_id\u003dconstants.SFC_ENCAP_TABLE,"},{"line_number":62,"context_line":"                priority\u003dconstants.PRIORITY_HIGH,"},{"line_number":63,"context_line":"                match\u003dself.app.parser.OFPMatch("},{"line_number":64,"context_line":"                    reg6\u003dfc.unique_key,"},{"line_number":65,"context_line":"                    eth_type\u003deth_type,"},{"line_number":66,"context_line":"                ),"},{"line_number":67,"context_line":"                inst\u003d["}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_bc028c08","line":64,"range":{"start_line":64,"start_character":20,"end_line":64,"end_character":24},"updated":"2017-07-09 11:53:18.000000000","message":"Same as in FC app - overriding reg6? Isn\u0027t there a danger of collision? Or is it safe because the tables are different?","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                table_id\u003dconstants.SFC_ENCAP_TABLE,"},{"line_number":62,"context_line":"                priority\u003dconstants.PRIORITY_HIGH,"},{"line_number":63,"context_line":"                match\u003dself.app.parser.OFPMatch("},{"line_number":64,"context_line":"                    reg6\u003dfc.unique_key,"},{"line_number":65,"context_line":"                    eth_type\u003deth_type,"},{"line_number":66,"context_line":"                ),"},{"line_number":67,"context_line":"                inst\u003d["}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_b7caa517","line":64,"range":{"start_line":64,"start_character":20,"end_line":64,"end_character":24},"in_reply_to":"3f1d235d_bc028c08","updated":"2017-07-09 14:28:32.000000000","message":"It is safe, because from L2 and onward reg6 is not being used.","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                ),"},{"line_number":172,"context_line":"            )"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    @classmethod"},{"line_number":175,"context_line":"    def _create_group_id(cls, label, extra):"},{"line_number":176,"context_line":"        # FIXME add global way to share group IDs"},{"line_number":177,"context_line":"        return (label \u003c\u003c 8) | extra"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    @classmethod"},{"line_number":180,"context_line":"    def _get_dispatch_to_all_group_id(cls, label):"},{"line_number":181,"context_line":"        return cls._create_group_id(label, 1)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @classmethod"},{"line_number":184,"context_line":"    def _get_dispatch_locally_group_id(cls, label):"},{"line_number":185,"context_line":"        return cls._create_group_id(label, 2)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _pp_to_bucket(self, pp):"},{"line_number":188,"context_line":"        if ("}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_bc4f2c91","line":185,"range":{"start_line":174,"start_character":0,"end_line":185,"end_character":45},"updated":"2017-07-09 11:53:18.000000000","message":"Same here re: class methods","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                ),"},{"line_number":172,"context_line":"            )"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    @classmethod"},{"line_number":175,"context_line":"    def _create_group_id(cls, label, extra):"},{"line_number":176,"context_line":"        # FIXME add global way to share group IDs"},{"line_number":177,"context_line":"        return (label \u003c\u003c 8) | extra"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    @classmethod"},{"line_number":180,"context_line":"    def _get_dispatch_to_all_group_id(cls, label):"},{"line_number":181,"context_line":"        return cls._create_group_id(label, 1)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @classmethod"},{"line_number":184,"context_line":"    def _get_dispatch_locally_group_id(cls, label):"},{"line_number":185,"context_line":"        return cls._create_group_id(label, 2)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _pp_to_bucket(self, pp):"},{"line_number":188,"context_line":"        if ("}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_97cfa928","line":185,"range":{"start_line":174,"start_character":0,"end_line":185,"end_character":45},"in_reply_to":"3f1d235d_bc4f2c91","updated":"2017-07-09 14:28:32.000000000","message":"Moved outside","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"17680dc83c8558c5d98d36ec4e5af5f5b136e9a7","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                    eth_type\u003dether_types.ETH_TYPE_MPLS,"},{"line_number":224,"context_line":"                    mpls_label\u003dlabel,"},{"line_number":225,"context_line":"                ),"},{"line_number":226,"context_line":"                inst\u003d["},{"line_number":227,"context_line":"                    self.app.parser.OFPInstructionActions("},{"line_number":228,"context_line":"                        self.app.ofproto.OFPIT_APPLY_ACTIONS,"},{"line_number":229,"context_line":"                        ["},{"line_number":230,"context_line":"                            self.app.parser.OFPActionGroup("},{"line_number":231,"context_line":"                                group_id\u003dall_group_id,"},{"line_number":232,"context_line":"                            ),"},{"line_number":233,"context_line":"                        ],"},{"line_number":234,"context_line":"                    ),"},{"line_number":235,"context_line":"                ],"},{"line_number":236,"context_line":"            )"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            for pp in ppg.port_pairs:"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_bc34ccfc","line":235,"range":{"start_line":226,"start_character":1,"end_line":235,"end_character":18},"updated":"2017-07-09 11:53:18.000000000","message":"nit: pass actions instead of inst.","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6c92838d3e8703c1e63c3e54482fd35934066788","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                    eth_type\u003dether_types.ETH_TYPE_MPLS,"},{"line_number":224,"context_line":"                    mpls_label\u003dlabel,"},{"line_number":225,"context_line":"                ),"},{"line_number":226,"context_line":"                inst\u003d["},{"line_number":227,"context_line":"                    self.app.parser.OFPInstructionActions("},{"line_number":228,"context_line":"                        self.app.ofproto.OFPIT_APPLY_ACTIONS,"},{"line_number":229,"context_line":"                        ["},{"line_number":230,"context_line":"                            self.app.parser.OFPActionGroup("},{"line_number":231,"context_line":"                                group_id\u003dall_group_id,"},{"line_number":232,"context_line":"                            ),"},{"line_number":233,"context_line":"                        ],"},{"line_number":234,"context_line":"                    ),"},{"line_number":235,"context_line":"                ],"},{"line_number":236,"context_line":"            )"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            for pp in ppg.port_pairs:"}],"source_content_type":"text/x-python","patch_set":33,"id":"3f1d235d_77d40dbe","line":235,"range":{"start_line":226,"start_character":1,"end_line":235,"end_character":18},"in_reply_to":"3f1d235d_bc34ccfc","updated":"2017-07-09 14:28:32.000000000","message":"Done","commit_id":"439ef7716e9aeac6e49af060d797229530d1540f"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"001ccac48fb2fbccc58713fabc00d1c386f92cd6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_decap_label(cls, port_chain, flow_classifier):"},{"line_number":76,"context_line":"        # Same here"},{"line_number":77,"context_line":"        return cls._get_egress_label("},{"line_number":78,"context_line":"            port_chain,"},{"line_number":79,"context_line":"            flow_classifier,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_19aba41d","line":76,"range":{"start_line":76,"start_character":8,"end_line":76,"end_character":19},"updated":"2017-07-11 05:30:17.000000000","message":"Does not add any info, maybe worth to remove","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"7a37c2a4f4c38b6faa01c094286fc3517e216cc0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_decap_label(cls, port_chain, flow_classifier):"},{"line_number":76,"context_line":"        # Same here"},{"line_number":77,"context_line":"        return cls._get_egress_label("},{"line_number":78,"context_line":"            port_chain,"},{"line_number":79,"context_line":"            flow_classifier,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_77f97f7e","line":76,"range":{"start_line":76,"start_character":8,"end_line":76,"end_character":19},"in_reply_to":"3f1d235d_19aba41d","updated":"2017-07-11 13:57:22.000000000","message":"In my opinion it does, if we\u0027ll refactor the call above, this will serve as a reminder to change this one as well.","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"8ecf8d7092bb65e0f4640b6438220aa895e0fe80","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_decap_label(cls, port_chain, flow_classifier):"},{"line_number":76,"context_line":"        # Same here"},{"line_number":77,"context_line":"        return cls._get_egress_label("},{"line_number":78,"context_line":"            port_chain,"},{"line_number":79,"context_line":"            flow_classifier,"}],"source_content_type":"text/x-python","patch_set":36,"id":"1f1a1f67_a0eed785","line":76,"range":{"start_line":76,"start_character":8,"end_line":76,"end_character":19},"in_reply_to":"3f1d235d_77f97f7e","updated":"2017-07-13 06:31:44.000000000","message":"Then better repeat same statement","commit_id":"1240270ed5f8f0cae708947c059c1abd26bbab34"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"f5003a2c1420ab6b95342f1a167d2b742b10736f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    return _create_group_id(label, 2)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class _SimpleMplsLabelAllocator(object):"},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def _create_label(cls, chain_idx, fc_idx, ppg_idx):"},{"line_number":42,"context_line":"        return ppg_idx | (fc_idx \u003c\u003c 8) | (chain_idx \u003c\u003c 11)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_9f060d1c","line":39,"updated":"2017-07-18 08:08:39.000000000","message":"Some of these are class methods, and others are regular methods. Why have two types?","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"996b5b83988dea3e3855568c082957dd0fa7b9d2","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    return _create_group_id(label, 2)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class _SimpleMplsLabelAllocator(object):"},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def _create_label(cls, chain_idx, fc_idx, ppg_idx):"},{"line_number":42,"context_line":"        return ppg_idx | (fc_idx \u003c\u003c 8) | (chain_idx \u003c\u003c 11)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_5fd2b501","line":39,"in_reply_to":"1f1a1f67_9f060d1c","updated":"2017-07-18 09:41:45.000000000","message":"oops","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"f5003a2c1420ab6b95342f1a167d2b742b10736f","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            priority\u003dconstants.PRIORITY_HIGH,"},{"line_number":303,"context_line":"            match\u003dself.app.parser.OFPMatch("},{"line_number":304,"context_line":"                eth_type\u003dether_types.ETH_TYPE_MPLS,"},{"line_number":305,"context_line":"                mpls_label\u003dlabel,"},{"line_number":306,"context_line":"            ),"},{"line_number":307,"context_line":"        )"},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_5f9995c1","line":305,"updated":"2017-07-18 08:08:39.000000000","message":"The match here doesn\u0027t match the one in _install_port_pair_decap_flows: Missing mpls_tc.","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"996b5b83988dea3e3855568c082957dd0fa7b9d2","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            priority\u003dconstants.PRIORITY_HIGH,"},{"line_number":303,"context_line":"            match\u003dself.app.parser.OFPMatch("},{"line_number":304,"context_line":"                eth_type\u003dether_types.ETH_TYPE_MPLS,"},{"line_number":305,"context_line":"                mpls_label\u003dlabel,"},{"line_number":306,"context_line":"            ),"},{"line_number":307,"context_line":"        )"},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_4829dde3","line":305,"in_reply_to":"1f1a1f67_5f9995c1","updated":"2017-07-18 09:41:45.000000000","message":"It matches all values of mpls_tc","commit_id":"15be7bc80943d042c92b6ee58c3ffe7822fe156c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"6500c2610787c5e200ccde8319e673080c9b76fd","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        )"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class MplsDriver(_SimpleMplsLabelAllocator, sfc_driver_base.SfcBaseDriver):"},{"line_number":88,"context_line":"    _ETH_TYPE_TO_TC \u003d {"},{"line_number":89,"context_line":"        ether_types.ETH_TYPE_IP: 0,"},{"line_number":90,"context_line":"        ether_types.ETH_TYPE_IPV6: 1,"}],"source_content_type":"text/x-python","patch_set":40,"id":"1f1a1f67_560bb722","line":87,"range":{"start_line":87,"start_character":17,"end_line":87,"end_character":42},"updated":"2017-07-18 13:10:22.000000000","message":"No exactly what I had in mind :)","commit_id":"cacfd1af1cdebaa3287d04058b4dc41561f2be16"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"8506281f3833c68896a08d369c0625000cbcb069","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                ),"},{"line_number":184,"context_line":"            )"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def _install_forward_to_dest(self, port_chain, flow_classifier):"},{"line_number":187,"context_line":"        for eth_type in self._ETH_TYPE_TO_TC:"},{"line_number":188,"context_line":"            self.app.mod_flow("},{"line_number":189,"context_line":"                table_id\u003dconstants.SFC_MPLS_DISPATCH_TABLE,"}],"source_content_type":"text/x-python","patch_set":41,"id":"1f1a1f67_884a0381","line":186,"updated":"2017-07-24 15:15:28.000000000","message":"maybe _install_forward_to_remote will be more clear?","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6cbf84826499d71b6e019db8914ad41f0e32d704","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                ),"},{"line_number":184,"context_line":"            )"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def _install_forward_to_dest(self, port_chain, flow_classifier):"},{"line_number":187,"context_line":"        for eth_type in self._ETH_TYPE_TO_TC:"},{"line_number":188,"context_line":"            self.app.mod_flow("},{"line_number":189,"context_line":"                table_id\u003dconstants.SFC_MPLS_DISPATCH_TABLE,"}],"source_content_type":"text/x-python","patch_set":41,"id":"ff346bd7_a30fdb2c","line":186,"in_reply_to":"1f1a1f67_884a0381","updated":"2017-07-24 19:25:41.000000000","message":"Lots of nodes are remote, only one is the destination","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"8506281f3833c68896a08d369c0625000cbcb069","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            )"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def install_flow_classifier_flows(self, port_chain, flow_classifier):"},{"line_number":231,"context_line":"        if flow_classifier.is_classification_local:"},{"line_number":232,"context_line":"            self._install_encap_flows(port_chain, flow_classifier)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        if flow_classifier.is_dispatch_local:"}],"source_content_type":"text/x-python","patch_set":41,"id":"1f1a1f67_08b0338b","line":231,"updated":"2017-07-24 15:15:28.000000000","message":"Maybe it\u0027s better to forward that logic(which flow should install when ) to the sfc.py and leave to the drivers just to install the relevant-flows? \n(something like - export install_encap_flows method in the driver-api - and the SFC itself will do \"if is local\")","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6cbf84826499d71b6e019db8914ad41f0e32d704","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            )"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def install_flow_classifier_flows(self, port_chain, flow_classifier):"},{"line_number":231,"context_line":"        if flow_classifier.is_classification_local:"},{"line_number":232,"context_line":"            self._install_encap_flows(port_chain, flow_classifier)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        if flow_classifier.is_dispatch_local:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ff346bd7_23a64bc3","line":231,"in_reply_to":"1f1a1f67_08b0338b","updated":"2017-07-24 19:25:41.000000000","message":"I don\u0027t mind doing that, I\u0027ll send another patch above this one to change that. This causes some considerable diff between the patchsets, and the reviewers have gone through enough of those already :)","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"226f70afcfc63443b750c792146e53f8351caffc","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                    mpls_tc\u003dself._ETH_TYPE_TO_TC[eth_type],"},{"line_number":292,"context_line":"                ),"},{"line_number":293,"context_line":"                actions\u003d["},{"line_number":294,"context_line":"                    self.app.parser.OFPActionPopMpls(eth_type),"},{"line_number":295,"context_line":"                    self.app.parser.NXActionResubmitTable("},{"line_number":296,"context_line":"                        table_id\u003dconstants.EGRESS_TABLE,"},{"line_number":297,"context_line":"                    ),"}],"source_content_type":"text/x-python","patch_set":41,"id":"ff346bd7_5c06db88","line":294,"updated":"2017-07-24 15:25:47.000000000","message":"where the re-encap on the egress flow happened ?","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6cbf84826499d71b6e019db8914ad41f0e32d704","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                    mpls_tc\u003dself._ETH_TYPE_TO_TC[eth_type],"},{"line_number":292,"context_line":"                ),"},{"line_number":293,"context_line":"                actions\u003d["},{"line_number":294,"context_line":"                    self.app.parser.OFPActionPopMpls(eth_type),"},{"line_number":295,"context_line":"                    self.app.parser.NXActionResubmitTable("},{"line_number":296,"context_line":"                        table_id\u003dconstants.EGRESS_TABLE,"},{"line_number":297,"context_line":"                    ),"}],"source_content_type":"text/x-python","patch_set":41,"id":"ff346bd7_d1762cd9","line":294,"in_reply_to":"ff346bd7_5c06db88","updated":"2017-07-24 19:25:41.000000000","message":"Line 488","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"8506281f3833c68896a08d369c0625000cbcb069","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                port_pair_group,"},{"line_number":442,"context_line":"                port_pair,"},{"line_number":443,"context_line":"            )"},{"line_number":444,"context_line":"        elif port_pair.correlation_mechanism \u003d\u003d sfc.CORR_NONE:"},{"line_number":445,"context_line":"            self._install_none_port_pair_egress_flows("},{"line_number":446,"context_line":"                port_chain,"},{"line_number":447,"context_line":"                port_pair_group,"}],"source_content_type":"text/x-python","patch_set":41,"id":"ff346bd7_df1880d4","line":444,"updated":"2017-07-24 15:15:28.000000000","message":"Is that the way for disable the driver?","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6cbf84826499d71b6e019db8914ad41f0e32d704","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                port_pair_group,"},{"line_number":442,"context_line":"                port_pair,"},{"line_number":443,"context_line":"            )"},{"line_number":444,"context_line":"        elif port_pair.correlation_mechanism \u003d\u003d sfc.CORR_NONE:"},{"line_number":445,"context_line":"            self._install_none_port_pair_egress_flows("},{"line_number":446,"context_line":"                port_chain,"},{"line_number":447,"context_line":"                port_pair_group,"}],"source_content_type":"text/x-python","patch_set":41,"id":"ff346bd7_51635c1b","line":444,"in_reply_to":"ff346bd7_df1880d4","updated":"2017-07-24 19:25:41.000000000","message":"No, this is for handling service functions that don\u0027t take MPLS","commit_id":"4fb75941d4c5dd7bdc32c2e3417984c3f8d6bcfb"}]}
