)]}'
{"dragonflow/controller/apps/fc.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3fcf12fc7601e7aebb97fa81faef53b66193f48c","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                    self.parser.OFPInstructionActions("},{"line_number":93,"context_line":"                        self.ofproto.OFPIT_APPLY_ACTIONS,"},{"line_number":94,"context_line":"                        ["},{"line_number":95,"context_line":"                            self.parser.OFPActionSetField(reg6\u003dfc.unique_key),"},{"line_number":96,"context_line":"                        ],"},{"line_number":97,"context_line":"                    ),"},{"line_number":98,"context_line":"                    self.parser.OFPInstructionGotoTable("}],"source_content_type":"text/x-python","patch_set":27,"id":"3f1d235d_e1dbbf1e","line":95,"range":{"start_line":95,"start_character":58,"end_line":95,"end_character":62},"updated":"2017-07-09 07:51:38.000000000","message":"Overloading reg6? Have you verified there is no collision with lport\u0027s unique_key/reg6?","commit_id":"fb84e92aa388b6ad0c3a6609c3dfbebe2be00556"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"8f0e3c00b93ab284f74aec0f98923c24812cb8e9","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                    self.parser.OFPInstructionActions("},{"line_number":93,"context_line":"                        self.ofproto.OFPIT_APPLY_ACTIONS,"},{"line_number":94,"context_line":"                        ["},{"line_number":95,"context_line":"                            self.parser.OFPActionSetField(reg6\u003dfc.unique_key),"},{"line_number":96,"context_line":"                        ],"},{"line_number":97,"context_line":"                    ),"},{"line_number":98,"context_line":"                    self.parser.OFPInstructionGotoTable("}],"source_content_type":"text/x-python","patch_set":27,"id":"3f1d235d_dc042881","line":95,"range":{"start_line":95,"start_character":58,"end_line":95,"end_character":62},"in_reply_to":"3f1d235d_e1dbbf1e","updated":"2017-07-09 10:42:05.000000000","message":"It should be fine, we\u0027re overloading reg6, and then encapsulating the packet and sending it to another host or into the first SF, both things erase reg6","commit_id":"fb84e92aa388b6ad0c3a6609c3dfbebe2be00556"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"d0ddde9962aad8ca33d7cd5f962cf7bf2de280a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2016 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_3908a02b","line":1,"range":{"start_line":1,"start_character":15,"end_line":1,"end_character":20},"updated":"2017-07-11 05:38:24.000000000","message":"2017","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"d0ddde9962aad8ca33d7cd5f962cf7bf2de280a5","unresolved":false,"context_lines":[{"line_number":46,"context_line":"class FcApp(df_base_app.DFlowApp):"},{"line_number":47,"context_line":"    def switch_features_handler(self, ev):"},{"line_number":48,"context_line":"        # Add SFC short-circuit in case SFC app is not loaded"},{"line_number":49,"context_line":"        self.add_flow_go_to_table(constants.SFC_ENCAP_TABLE,"},{"line_number":50,"context_line":"                                  constants.PRIORITY_DEFAULT,"},{"line_number":51,"context_line":"                                  constants.SFC_END_OF_CHAIN_TABLE)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _flow_classifiers_by_lport(self, lport):"},{"line_number":54,"context_line":"        return itertools.chain("}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_3c0d2e35","line":51,"range":{"start_line":49,"start_character":8,"end_line":51,"end_character":67},"updated":"2017-07-11 05:38:24.000000000","message":"I wonder if the FC should be coupled with SFC. Flow Classifier can be in use by apps like TAP, QoS .","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"cfd0dc2a8cae454bc5392f0b7facdbb132db9595","unresolved":false,"context_lines":[{"line_number":46,"context_line":"class FcApp(df_base_app.DFlowApp):"},{"line_number":47,"context_line":"    def switch_features_handler(self, ev):"},{"line_number":48,"context_line":"        # Add SFC short-circuit in case SFC app is not loaded"},{"line_number":49,"context_line":"        self.add_flow_go_to_table(constants.SFC_ENCAP_TABLE,"},{"line_number":50,"context_line":"                                  constants.PRIORITY_DEFAULT,"},{"line_number":51,"context_line":"                                  constants.SFC_END_OF_CHAIN_TABLE)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _flow_classifiers_by_lport(self, lport):"},{"line_number":54,"context_line":"        return itertools.chain("}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_fcde96d8","line":51,"range":{"start_line":49,"start_character":8,"end_line":51,"end_character":67},"in_reply_to":"3f1d235d_3c0d2e35","updated":"2017-07-11 06:37:16.000000000","message":"Flow classifier is networking-sfc API at the moment.","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"d0ddde9962aad8ca33d7cd5f962cf7bf2de280a5","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            self._install_dispatch_flows(flow_classifier)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _install_classification_flows(self, flow_classifier):"},{"line_number":90,"context_line":"        # FIXME (dimak) assume lport is a vm port for now"},{"line_number":91,"context_line":"        for match in self._create_matches(flow_classifier):"},{"line_number":92,"context_line":"            self.mod_flow("},{"line_number":93,"context_line":"                table_id\u003dself._get_flow_classifier_table(flow_classifier),"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_bc2a5e7b","line":90,"range":{"start_line":90,"start_character":41,"end_line":90,"end_character":44},"updated":"2017-07-11 05:38:24.000000000","message":"Container?","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"d0ddde9962aad8ca33d7cd5f962cf7bf2de280a5","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _install_dispatch_flows(self, flow_classifier):"},{"line_number":111,"context_line":"        lport \u003d self._get_flow_classifier_lport(flow_classifier)"},{"line_number":112,"context_line":"        # End-of-chain"},{"line_number":113,"context_line":"        # 1) Restore network ID in metadata and zero reg6"},{"line_number":114,"context_line":"        # 2) Restore port ID in reg7 in dest port"},{"line_number":115,"context_line":"        # 3) Resubmit to the next table"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_7c24c6af","line":112,"range":{"start_line":112,"start_character":7,"end_line":112,"end_character":22},"updated":"2017-07-11 05:38:24.000000000","message":"What chain?","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"cfd0dc2a8cae454bc5392f0b7facdbb132db9595","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _install_dispatch_flows(self, flow_classifier):"},{"line_number":111,"context_line":"        lport \u003d self._get_flow_classifier_lport(flow_classifier)"},{"line_number":112,"context_line":"        # End-of-chain"},{"line_number":113,"context_line":"        # 1) Restore network ID in metadata and zero reg6"},{"line_number":114,"context_line":"        # 2) Restore port ID in reg7 in dest port"},{"line_number":115,"context_line":"        # 3) Resubmit to the next table"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_77cbbf52","line":112,"range":{"start_line":112,"start_character":7,"end_line":112,"end_character":22},"in_reply_to":"3f1d235d_7c24c6af","updated":"2017-07-11 06:37:16.000000000","message":"Service function chain. This whole app is in the context of service function chaining.","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"d0ddde9962aad8ca33d7cd5f962cf7bf2de280a5","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        )"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _get_flow_classifier_table(self, flow_classifier):"},{"line_number":186,"context_line":"        if flow_classifier.source_port is not None:"},{"line_number":187,"context_line":"            return constants.L2_LOOKUP_TABLE"},{"line_number":188,"context_line":"        elif flow_classifier.dest_port is not None:"},{"line_number":189,"context_line":"            return constants.EGRESS_TABLE"},{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            raise ValueError("},{"line_number":192,"context_line":"                _(\u0027Neither source not destination port specified\u0027))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def _get_flow_classifier_lport(self, flow_classifier):"},{"line_number":195,"context_line":"        return flow_classifier.source_port or flow_classifier.dest_port"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_bc4ffe68","line":192,"range":{"start_line":186,"start_character":8,"end_line":192,"end_character":67},"updated":"2017-07-11 05:38:24.000000000","message":"what if both are specified?","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"cfd0dc2a8cae454bc5392f0b7facdbb132db9595","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        )"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _get_flow_classifier_table(self, flow_classifier):"},{"line_number":186,"context_line":"        if flow_classifier.source_port is not None:"},{"line_number":187,"context_line":"            return constants.L2_LOOKUP_TABLE"},{"line_number":188,"context_line":"        elif flow_classifier.dest_port is not None:"},{"line_number":189,"context_line":"            return constants.EGRESS_TABLE"},{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            raise ValueError("},{"line_number":192,"context_line":"                _(\u0027Neither source not destination port specified\u0027))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def _get_flow_classifier_lport(self, flow_classifier):"},{"line_number":195,"context_line":"        return flow_classifier.source_port or flow_classifier.dest_port"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_9ce9e281","line":192,"range":{"start_line":186,"start_character":8,"end_line":192,"end_character":67},"in_reply_to":"3f1d235d_bc4ffe68","updated":"2017-07-11 06:37:16.000000000","message":"API does not allow this","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"d0ddde9962aad8ca33d7cd5f962cf7bf2de280a5","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        return (self.parser.OFPMatch(**p) for p in param_list)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"def _multiply_params(old_params, new_params):"},{"line_number":264,"context_line":"    res \u003d []"},{"line_number":265,"context_line":"    for base, new in itertools.product(old_params, new_params):"},{"line_number":266,"context_line":"        p \u003d base.copy()"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_fc445649","line":263,"range":{"start_line":263,"start_character":4,"end_line":263,"end_character":20},"updated":"2017-07-11 05:38:24.000000000","message":"what is this supposed to do?","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"cfd0dc2a8cae454bc5392f0b7facdbb132db9595","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        return (self.parser.OFPMatch(**p) for p in param_list)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"def _multiply_params(old_params, new_params):"},{"line_number":264,"context_line":"    res \u003d []"},{"line_number":265,"context_line":"    for base, new in itertools.product(old_params, new_params):"},{"line_number":266,"context_line":"        p \u003d base.copy()"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_b7e6f7e7","line":263,"range":{"start_line":263,"start_character":4,"end_line":263,"end_character":20},"in_reply_to":"3f1d235d_fc445649","updated":"2017-07-11 06:37:16.000000000","message":"Creates product of all elements provided in arguments.","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4d524d2255cc6e774702b5f41b197079f2a66e48","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                        self.ofproto.OFPIT_APPLY_ACTIONS,"},{"line_number":96,"context_line":"                        ["},{"line_number":97,"context_line":"                            self.parser.OFPActionSetField("},{"line_number":98,"context_line":"                                reg6\u003dflow_classifier.unique_key),"},{"line_number":99,"context_line":"                        ],"},{"line_number":100,"context_line":"                    ),"},{"line_number":101,"context_line":"                    self.parser.OFPInstructionGotoTable("}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_19b69d3f","line":98,"range":{"start_line":98,"start_character":32,"end_line":98,"end_character":36},"updated":"2017-07-18 06:49:21.000000000","message":"Is it possible to use a different register? We have plenty of them free.","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"29e477b88a0c3f596ed4be75885e0dfef4286a96","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                        self.ofproto.OFPIT_APPLY_ACTIONS,"},{"line_number":96,"context_line":"                        ["},{"line_number":97,"context_line":"                            self.parser.OFPActionSetField("},{"line_number":98,"context_line":"                                reg6\u003dflow_classifier.unique_key),"},{"line_number":99,"context_line":"                        ],"},{"line_number":100,"context_line":"                    ),"},{"line_number":101,"context_line":"                    self.parser.OFPInstructionGotoTable("}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_2d68f3b6","line":98,"range":{"start_line":98,"start_character":32,"end_line":98,"end_character":36},"in_reply_to":"1f1a1f67_19b69d3f","updated":"2017-07-18 09:08:51.000000000","message":"Not sure about plent, but I\u0027ll change it to use reg2","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"8272dbda5135b2813323cc07d58b2cfbe58dfd0b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    def _remove_local_port(self, lport):"},{"line_number":149,"context_line":"        for fc in self._flow_classifiers_by_lport(lport):"},{"line_number":150,"context_line":"            # Remove classification/dispatch only if they\u0027re no longer needed"},{"line_number":151,"context_line":"            if fc.source_port is not None and fc.source_port.id \u003d\u003d lport.id:"},{"line_number":152,"context_line":"                self._uninstall_classification_flows(fc)"},{"line_number":153,"context_line":"            elif fc.dest_port is not None and fc.dest_port.id \u003d\u003d lport.id:"},{"line_number":154,"context_line":"                self._uninstall_dispatch_flows(fc)"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_b57d6fb3","line":151,"range":{"start_line":151,"start_character":15,"end_line":151,"end_character":76},"updated":"2017-07-18 06:47:15.000000000","message":"nit: This condition is reused. Maybe move to a method?","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"29e477b88a0c3f596ed4be75885e0dfef4286a96","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    def _remove_local_port(self, lport):"},{"line_number":149,"context_line":"        for fc in self._flow_classifiers_by_lport(lport):"},{"line_number":150,"context_line":"            # Remove classification/dispatch only if they\u0027re no longer needed"},{"line_number":151,"context_line":"            if fc.source_port is not None and fc.source_port.id \u003d\u003d lport.id:"},{"line_number":152,"context_line":"                self._uninstall_classification_flows(fc)"},{"line_number":153,"context_line":"            elif fc.dest_port is not None and fc.dest_port.id \u003d\u003d lport.id:"},{"line_number":154,"context_line":"                self._uninstall_dispatch_flows(fc)"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_cdbdffd8","line":151,"range":{"start_line":151,"start_character":15,"end_line":151,"end_character":76},"in_reply_to":"1f1a1f67_b57d6fb3","updated":"2017-07-18 09:08:51.000000000","message":"Done","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"89331a2b4aff8640ebf84ed500c2bdfe19e4e5ea","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            match\u003dself.parser.OFPMatch(reg6\u003dflow_classifier.unique_key),"},{"line_number":180,"context_line":"        )"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _get_flow_classifier_table(self, flow_classifier):"},{"line_number":183,"context_line":"        if flow_classifier.source_port is not None:"},{"line_number":184,"context_line":"            return constants.L2_LOOKUP_TABLE"},{"line_number":185,"context_line":"        elif flow_classifier.dest_port is not None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_3b1ccd76","line":182,"updated":"2017-07-17 13:57:18.000000000","message":"IF it\u0027s on both - isn\u0027t it should be match on the egress ?(as we still don\u0027t know the dst-port in L2_LOOKUP_TABLE)","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"8272dbda5135b2813323cc07d58b2cfbe58dfd0b","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            match\u003dself.parser.OFPMatch(reg6\u003dflow_classifier.unique_key),"},{"line_number":180,"context_line":"        )"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _get_flow_classifier_table(self, flow_classifier):"},{"line_number":183,"context_line":"        if flow_classifier.source_port is not None:"},{"line_number":184,"context_line":"            return constants.L2_LOOKUP_TABLE"},{"line_number":185,"context_line":"        elif flow_classifier.dest_port is not None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_95283397","line":182,"in_reply_to":"1f1a1f67_3b1ccd76","updated":"2017-07-18 06:47:15.000000000","message":"It can\u0027t be on both. This is validated in the driver.","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"89331a2b4aff8640ebf84ed500c2bdfe19e4e5ea","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        return (self.parser.OFPMatch(**p) for p in param_list)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"def _multiply_params(old_params, new_params):"},{"line_number":261,"context_line":"    \u0027\u0027\u0027Create combined dictionaries for all pairs of (old, new) params."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    Example:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_c4161a56","line":260,"range":{"start_line":259,"start_character":0,"end_line":260,"end_character":11},"updated":"2017-07-17 13:57:18.000000000","message":"Maybe change function name to _cartesian_product?","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"29e477b88a0c3f596ed4be75885e0dfef4286a96","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        return (self.parser.OFPMatch(**p) for p in param_list)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"def _multiply_params(old_params, new_params):"},{"line_number":261,"context_line":"    \u0027\u0027\u0027Create combined dictionaries for all pairs of (old, new) params."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    Example:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_4d99efc1","line":260,"range":{"start_line":259,"start_character":0,"end_line":260,"end_character":11},"in_reply_to":"1f1a1f67_c4161a56","updated":"2017-07-18 09:08:51.000000000","message":"It\u0027s not exactly this or that, but it\u0027s an internal function and it is accompanied by an example, so I think its good enough for what it is.\n\nPlus I like the current name better.","commit_id":"9d67e4811e8142c57e0c1127f1eae2a85069f56a"}],"dragonflow/controller/fc_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e88c48ff58fb05ec08a8333a7ad83cdefd220708","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                                  constants.PRIORITY_DEFAULT,"},{"line_number":37,"context_line":"                                  constants.SFC_END_OF_CHAIN_TABLE)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _get_fcs_by_lport(self, lport):"},{"line_number":40,"context_line":"        for fc in itertools.chain("},{"line_number":41,"context_line":"            self.db_store2.get_all("},{"line_number":42,"context_line":"                sfc.FlowClassifier(source_port\u003dlport),"},{"line_number":43,"context_line":"                index\u003dsfc.FlowClassifier.get_index(\u0027source_port\u0027),"},{"line_number":44,"context_line":"            ),"},{"line_number":45,"context_line":"            self.db_store2.get_all("},{"line_number":46,"context_line":"                sfc.FlowClassifier(dest_port\u003dlport),"},{"line_number":47,"context_line":"                index\u003dsfc.FlowClassifier.get_index(\u0027dest_port\u0027),"},{"line_number":48,"context_line":"            ),"},{"line_number":49,"context_line":"        ):"},{"line_number":50,"context_line":"            yield fc"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_CREATED)"},{"line_number":53,"context_line":"    def _local_lport_added(self, lport):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_9e09da2d","line":50,"range":{"start_line":39,"start_character":0,"end_line":50,"end_character":20},"updated":"2017-06-13 08:12:37.000000000","message":"Isn\u0027t this the same as: return itertools.chain(...) ? And the we bypass the second loop?","commit_id":"15c5bb231b3f509b7705c225dd73484f5a1c813a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e88c48ff58fb05ec08a8333a7ad83cdefd220708","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            table_id\u003dconstants.SFC_END_OF_CHAIN_TABLE,"},{"line_number":115,"context_line":"            priority\u003dconstants.PRIORITY_HIGH,"},{"line_number":116,"context_line":"            match\u003dself.parser.OFPMatch(reg6\u003dfc.unique_key),"},{"line_number":117,"context_line":"            inst\u003d[inst],"},{"line_number":118,"context_line":"        )"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_DELETED)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_de7632a5","line":117,"range":{"start_line":117,"start_character":0,"end_line":117,"end_character":24},"updated":"2017-06-13 08:12:37.000000000","message":"I think that in this case, you can pass actions\u003dactions, and mod_flow creates the OFPIT_APPLY_ACTIONS instructions for you.","commit_id":"15c5bb231b3f509b7705c225dd73484f5a1c813a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e88c48ff58fb05ec08a8333a7ad83cdefd220708","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            param_list \u003d _multiply_params(param_list, l4_params)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        return [self.parser.OFPMatch(**p) for p in param_list]"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"def _multiply_params(old_params, new_params):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_1ef14ace","line":233,"range":{"start_line":233,"start_character":0,"end_line":233,"end_character":62},"updated":"2017-06-13 08:12:37.000000000","message":"Always used in a loop. Maybe yield instead of returning a list?","commit_id":"15c5bb231b3f509b7705c225dd73484f5a1c813a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e88c48ff58fb05ec08a8333a7ad83cdefd220708","unresolved":false,"context_lines":[{"line_number":280,"context_line":"    return params"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"def _create_l4_port_params(fc, src_label, dst_label):"},{"line_number":284,"context_line":"    params \u003d [{}]"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    if fc.source_transport_ports is not None:"},{"line_number":287,"context_line":"        source_port_params \u003d utils.get_port_match_list_from_port_range("}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_d4e051cf","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":17},"updated":"2017-06-13 08:12:37.000000000","message":"Maybe allow an argument for initial params? Then _create_tcp/udp_params can initialise it to \u0027ip_proto\u0027: (whatever) and you can forgo the loop at the end.","commit_id":"15c5bb231b3f509b7705c225dd73484f5a1c813a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2fc582495dfa80e45db6be858e2fe3ebca00c797","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                sfc.FlowClassifier(dest_port\u003dlport),"},{"line_number":60,"context_line":"                index\u003dsfc.FlowClassifier.get_index(\u0027dest_port\u0027),"},{"line_number":61,"context_line":"            ),"},{"line_number":62,"context_line":"        ):"},{"line_number":63,"context_line":"            yield fc"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_CREATED)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_dfc32937","line":62,"updated":"2017-06-28 13:32:26.000000000","message":"Comment from PS18 was not answered:\n\n\u003e Isn\u0027t this the same as: return itertools.chain(...) ? And the we bypass the second loop?","commit_id":"ba77ba1b3b2a1e389848252c21d44a703b63908a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2fc582495dfa80e45db6be858e2fe3ebca00c797","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        elif fc.dest_port \u003d\u003d lport:"},{"line_number":117,"context_line":"            done_bit \u003d _DST_BIT"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # FIXME maybe get it from L2 table"},{"line_number":120,"context_line":"            actions.append("},{"line_number":121,"context_line":"                self.parser.OFPActionSetField(reg7\u003dlport.unique_key)"},{"line_number":122,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_5ffef96a","line":119,"updated":"2017-06-28 13:32:26.000000000","message":"Add your nick here (FIXME(dimak))","commit_id":"ba77ba1b3b2a1e389848252c21d44a703b63908a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2fc582495dfa80e45db6be858e2fe3ebca00c797","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            table_id\u003dconstants.SFC_END_OF_CHAIN_TABLE,"},{"line_number":138,"context_line":"            priority\u003dconstants.PRIORITY_MEDIUM,"},{"line_number":139,"context_line":"            match\u003dself.parser.OFPMatch(reg6\u003dfc.unique_key),"},{"line_number":140,"context_line":"            inst\u003d["},{"line_number":141,"context_line":"                self.parser.OFPInstructionActions("},{"line_number":142,"context_line":"                    self.ofproto.OFPIT_APPLY_ACTIONS,"},{"line_number":143,"context_line":"                    actions,"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_5f0cb992","line":140,"updated":"2017-06-28 13:32:26.000000000","message":"Command from PS18 not answered:\n\n\u003e I think that in this case, you can pass actions\u003dactions, and mod_flow creates the OFPIT_APPLY_ACTIONS instructions for you.","commit_id":"ba77ba1b3b2a1e389848252c21d44a703b63908a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2fc582495dfa80e45db6be858e2fe3ebca00c797","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        param_list \u003d [params]"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        if fc.protocol is not None:"},{"line_number":236,"context_line":"            if fc.protocol \u003d\u003d \u0027TCP\u0027:"},{"line_number":237,"context_line":"                l4_params \u003d _create_tcp_params(fc)"},{"line_number":238,"context_line":"            elif fc.protocol \u003d\u003d \u0027UDP\u0027:"},{"line_number":239,"context_line":"                l4_params \u003d _create_udp_params(fc)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_9f64914b","line":236,"range":{"start_line":236,"start_character":31,"end_line":236,"end_character":34},"updated":"2017-06-28 13:32:26.000000000","message":"Constant?","commit_id":"ba77ba1b3b2a1e389848252c21d44a703b63908a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2fc582495dfa80e45db6be858e2fe3ebca00c797","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"            param_list \u003d _multiply_params(param_list, l4_params)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        return [self.parser.OFPMatch(**p) for p in param_list]"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"def _multiply_params(old_params, new_params):"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_bf486db2","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":62},"updated":"2017-06-28 13:32:26.000000000","message":"Comment from PS18 not answered:\n\n\u003e Always used in a loop. Maybe yield instead of returning a list?\n\nOr at least return a tuple/generator?","commit_id":"ba77ba1b3b2a1e389848252c21d44a703b63908a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2fc582495dfa80e45db6be858e2fe3ebca00c797","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    return params"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"def _create_l4_port_params(fc, src_label, dst_label):"},{"line_number":297,"context_line":"    params \u003d [{}]"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    if fc.source_transport_ports is not None:"},{"line_number":300,"context_line":"        source_port_params \u003d utils.get_port_match_list_from_port_range("}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_7ff53556","line":297,"range":{"start_line":296,"start_character":0,"end_line":297,"end_character":17},"updated":"2017-06-28 13:32:26.000000000","message":"Comment from PS18 not answered:\n\n\u003e Maybe allow an argument for initial params? Then _create_tcp/udp_params can initialise it to \u0027ip_proto\u0027: (whatever) and you can forgo the loop at the end.","commit_id":"ba77ba1b3b2a1e389848252c21d44a703b63908a"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"ec94a6e17d7d351288aef3df77ed5cc7c66e4b38","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        for fc in self._get_fcs_by_lport(lport):"},{"line_number":68,"context_line":"            self._install_flow_classifier(fc)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _install_flow_classifier(self, fc):"},{"line_number":71,"context_line":"        # If FC is on a source lport, install flows only when its local"},{"line_number":72,"context_line":"        # If FC is on a dest lport, install everywhere, we can start the chain"},{"line_number":73,"context_line":"        # here and save a few hops."}],"source_content_type":"text/x-python","patch_set":25,"id":"3f1d235d_6c8cc67e","line":70,"updated":"2017-07-05 08:13:27.000000000","message":"That mean that we don\u0027t support only classifier that include src-lport or dst-lport. \n1. Maybe it better to add a comment that explain why \n2. Maybe the FC creation in the mech driver should fail - when we don\u0027t have src or dst..","commit_id":"677b71581ee44fab96461bf12d0f86d4c2b91bec"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"a0fc0566b59a716b75645bca09a8d252708ee0c8","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        for fc in self._get_fcs_by_lport(lport):"},{"line_number":68,"context_line":"            self._install_flow_classifier(fc)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _install_flow_classifier(self, fc):"},{"line_number":71,"context_line":"        # If FC is on a source lport, install flows only when its local"},{"line_number":72,"context_line":"        # If FC is on a dest lport, install everywhere, we can start the chain"},{"line_number":73,"context_line":"        # here and save a few hops."}],"source_content_type":"text/x-python","patch_set":25,"id":"3f1d235d_8f549bff","line":70,"in_reply_to":"3f1d235d_6c8cc67e","updated":"2017-07-05 19:09:24.000000000","message":"I\u0027m not sure I understand 1, about 2 I\u0027ll check if networking-sfc API allows that and if it does what are the implications.","commit_id":"677b71581ee44fab96461bf12d0f86d4c2b91bec"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"ec94a6e17d7d351288aef3df77ed5cc7c66e4b38","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _get_fc_table(self, fc):"},{"line_number":166,"context_line":"        if fc.source_port is not None:"},{"line_number":167,"context_line":"            return constants.L2_LOOKUP_TABLE"},{"line_number":168,"context_line":"        elif fc.dest_port is not None:"},{"line_number":169,"context_line":"            return constants.EGRESS_TABLE"},{"line_number":170,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f1d235d_2cd92e7e","line":167,"updated":"2017-07-05 08:13:27.000000000","message":"I think that we won\u0027t classify arp,icmp and dhcp , is that ok?","commit_id":"677b71581ee44fab96461bf12d0f86d4c2b91bec"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"a0fc0566b59a716b75645bca09a8d252708ee0c8","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _get_fc_table(self, fc):"},{"line_number":166,"context_line":"        if fc.source_port is not None:"},{"line_number":167,"context_line":"            return constants.L2_LOOKUP_TABLE"},{"line_number":168,"context_line":"        elif fc.dest_port is not None:"},{"line_number":169,"context_line":"            return constants.EGRESS_TABLE"},{"line_number":170,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f1d235d_cf9cd3c1","line":167,"in_reply_to":"3f1d235d_2cd92e7e","updated":"2017-07-05 19:09:24.000000000","message":"I can\u0027t think of scenario where we\u0027d need to classify ARP or DHCP traffic, about ICMP, it can be classified as it goes through L2.","commit_id":"677b71581ee44fab96461bf12d0f86d4c2b91bec"}],"dragonflow/tests/unit/test_fc_app.py":[{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"9e058bdb534697ceb753c270711d35e2505e29b1","unresolved":false,"context_lines":[{"line_number":63,"context_line":"fc2 \u003d sfc.FlowClassifier("},{"line_number":64,"context_line":"    id\u003d\u0027fc2\u0027,"},{"line_number":65,"context_line":"    topic\u003d\u0027topic1\u0027,"},{"line_number":66,"context_line":"    unique_key\u003d12,"},{"line_number":67,"context_line":"    dest_port\u003d\u0027lport2\u0027,"},{"line_number":68,"context_line":")"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_981c4078","line":66,"updated":"2017-07-11 14:32:34.000000000","message":"Is that OK that 2 objects have the same unique key?\n(they created in same test in the code below .. )","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f06cc30c6481b33831f68ffeb467b7abe223f9db","unresolved":false,"context_lines":[{"line_number":63,"context_line":"fc2 \u003d sfc.FlowClassifier("},{"line_number":64,"context_line":"    id\u003d\u0027fc2\u0027,"},{"line_number":65,"context_line":"    topic\u003d\u0027topic1\u0027,"},{"line_number":66,"context_line":"    unique_key\u003d12,"},{"line_number":67,"context_line":"    dest_port\u003d\u0027lport2\u0027,"},{"line_number":68,"context_line":")"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"1f1a1f67_bf3b3ce9","line":66,"in_reply_to":"3f1d235d_981c4078","updated":"2017-07-16 07:05:27.000000000","message":"I\u0027ll change that","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"9e058bdb534697ceb753c270711d35e2505e29b1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    dest_port\u003d\u0027lport1\u0027,"},{"line_number":120,"context_line":")"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"fc13 \u003d sfc.FlowClassifier("},{"line_number":123,"context_line":"    id\u003d\u0027fc13\u0027,"},{"line_number":124,"context_line":"    topic\u003d\u0027topic1\u0027,"},{"line_number":125,"context_line":"    unique_key\u003d13,"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_84085991","line":122,"updated":"2017-07-11 14:32:34.000000000","message":"Maybe add some test that classify according to l3/l4 parameters\nand verify that we trying to install the flows in a correct way?","commit_id":"692614b111237eead7f190df6fa9f55d26101366"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f06cc30c6481b33831f68ffeb467b7abe223f9db","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    dest_port\u003d\u0027lport1\u0027,"},{"line_number":120,"context_line":")"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"fc13 \u003d sfc.FlowClassifier("},{"line_number":123,"context_line":"    id\u003d\u0027fc13\u0027,"},{"line_number":124,"context_line":"    topic\u003d\u0027topic1\u0027,"},{"line_number":125,"context_line":"    unique_key\u003d13,"}],"source_content_type":"text/x-python","patch_set":30,"id":"1f1a1f67_df34b8fd","line":122,"in_reply_to":"3f1d235d_84085991","updated":"2017-07-16 07:05:27.000000000","message":"Fullstack tests take care of that","commit_id":"692614b111237eead7f190df6fa9f55d26101366"}]}
