)]}'
{"dragonflow/controller/tenant_snat_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"be52db04d0c1bcf08b481cb773df8adc6c89c137","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                self._install_snat_egress_after_conntrack(match,"},{"line_number":46,"context_line":"                    lport.get_binding_profile()[EXTERNAL_HOST_MAC])"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def install_common_flows(self):"},{"line_number":49,"context_line":"        self._install_ingress_goto_rules()"},{"line_number":50,"context_line":"        self._install_snat_ingress_conntrack()"},{"line_number":51,"context_line":"        self._install_egress_goto_rules()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def install_lport_specific_flows(self, lport):"},{"line_number":54,"context_line":"        # instance specific flows"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_2f13e667","line":51,"range":{"start_line":48,"start_character":0,"end_line":51,"end_character":41},"updated":"2017-02-12 08:24:02.000000000","message":"This code is duplicated in the chassis snat app. Maybe move it to base class, and call \u0027super\u0027?","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"01cf9df831090ad5982d64c53d72d84b25c32a41","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                self._install_snat_egress_after_conntrack(match,"},{"line_number":46,"context_line":"                    lport.get_binding_profile()[EXTERNAL_HOST_MAC])"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def install_common_flows(self):"},{"line_number":49,"context_line":"        self._install_ingress_goto_rules()"},{"line_number":50,"context_line":"        self._install_snat_ingress_conntrack()"},{"line_number":51,"context_line":"        self._install_egress_goto_rules()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def install_lport_specific_flows(self, lport):"},{"line_number":54,"context_line":"        # instance specific flows"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_0800d800","line":51,"range":{"start_line":48,"start_character":0,"end_line":51,"end_character":41},"in_reply_to":"fa31d9ce_2f13e667","updated":"2017-02-12 13:07:06.000000000","message":"Done","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"be52db04d0c1bcf08b481cb773df8adc6c89c137","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                        ext_host_mac)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        parser \u003d self.parser"},{"line_number":64,"context_line":"        match \u003d parser.OFPMatch("},{"line_number":65,"context_line":"                eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":66,"context_line":"                ipv4_src\u003dlport.get_ip())"},{"line_number":67,"context_line":"        self._install_snat_egress_conntrack(match, ext_host_ip)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        match \u003d parser.OFPMatch("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_1203a90e","line":66,"range":{"start_line":64,"start_character":0,"end_line":66,"end_character":40},"updated":"2017-02-12 08:24:02.000000000","message":"I think a match by reg6 or in_port would be better here. (To avoid IP collision)","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"01cf9df831090ad5982d64c53d72d84b25c32a41","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                        ext_host_mac)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        parser \u003d self.parser"},{"line_number":64,"context_line":"        match \u003d parser.OFPMatch("},{"line_number":65,"context_line":"                eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":66,"context_line":"                ipv4_src\u003dlport.get_ip())"},{"line_number":67,"context_line":"        self._install_snat_egress_conntrack(match, ext_host_ip)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        match \u003d parser.OFPMatch("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_28091cde","line":66,"range":{"start_line":64,"start_character":0,"end_line":66,"end_character":40},"in_reply_to":"fa31d9ce_1203a90e","updated":"2017-02-12 13:07:06.000000000","message":"I agree. Need to change this","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"be52db04d0c1bcf08b481cb773df8adc6c89c137","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                ipv4_src\u003dlport.get_ip())"},{"line_number":67,"context_line":"        self._install_snat_egress_conntrack(match, ext_host_ip)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        match \u003d parser.OFPMatch("},{"line_number":70,"context_line":"                eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":71,"context_line":"                eth_src\u003dlport.get_mac())"},{"line_number":72,"context_line":"        self._install_snat_egress_after_conntrack(match, ext_host_mac)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # update arp responder if required"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_520d2136","line":71,"range":{"start_line":69,"start_character":0,"end_line":71,"end_character":40},"updated":"2017-02-12 08:24:02.000000000","message":"Same here.","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"be52db04d0c1bcf08b481cb773df8adc6c89c137","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            self.tenant_info[tenant_id] \u003d 1"},{"line_number":80,"context_line":"            self._install_arp_responder(ext_host_ip, ext_host_mac)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def remove_common_flows(self):"},{"line_number":83,"context_line":"        parser \u003d self.parser"},{"line_number":84,"context_line":"        ofproto \u003d self.ofproto"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_32218da0","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":34},"updated":"2017-02-12 08:24:02.000000000","message":"Same as in chassis snat: Why install_common_flows has pre-defined methods, but remove has to call mod_flow directly?","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"01cf9df831090ad5982d64c53d72d84b25c32a41","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            self.tenant_info[tenant_id] \u003d 1"},{"line_number":80,"context_line":"            self._install_arp_responder(ext_host_ip, ext_host_mac)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def remove_common_flows(self):"},{"line_number":83,"context_line":"        parser \u003d self.parser"},{"line_number":84,"context_line":"        ofproto \u003d self.ofproto"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_2803dc0e","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":34},"in_reply_to":"fa31d9ce_32218da0","updated":"2017-02-12 13:07:06.000000000","message":"Answered in ChassisSnat patch","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"}],"dragonflow/neutron/ml2/mech_driver.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"be52db04d0c1bcf08b481cb773df8adc6c89c137","unresolved":false,"context_lines":[{"line_number":665,"context_line":"            original_profile \u003d original_port.get(\u0027binding:profile\u0027)"},{"line_number":666,"context_line":"            if \u0027external_host_ip\u0027 not in original_profile:"},{"line_number":667,"context_line":"                external_host_ip, external_host_mac \u003d \\"},{"line_number":668,"context_line":"                    self._extract_local_bind_info(context, updated_port)"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"                if external_host_ip is not None:"},{"line_number":671,"context_line":"                    binding_profile.update("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_726945be","line":668,"range":{"start_line":668,"start_character":0,"end_line":668,"end_character":72},"updated":"2017-02-12 08:24:02.000000000","message":"Unless this is called every time, won\u0027t the tenant be able to change the binding profile, and masquerade as a different tenant?","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"01cf9df831090ad5982d64c53d72d84b25c32a41","unresolved":false,"context_lines":[{"line_number":665,"context_line":"            original_profile \u003d original_port.get(\u0027binding:profile\u0027)"},{"line_number":666,"context_line":"            if \u0027external_host_ip\u0027 not in original_profile:"},{"line_number":667,"context_line":"                external_host_ip, external_host_mac \u003d \\"},{"line_number":668,"context_line":"                    self._extract_local_bind_info(context, updated_port)"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"                if external_host_ip is not None:"},{"line_number":671,"context_line":"                    binding_profile.update("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_ed02b60a","line":668,"range":{"start_line":668,"start_character":0,"end_line":668,"end_character":72},"in_reply_to":"fa31d9ce_726945be","updated":"2017-02-12 13:07:06.000000000","message":"not understand this comment","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"be52db04d0c1bcf08b481cb773df8adc6c89c137","unresolved":false,"context_lines":[{"line_number":822,"context_line":""},{"line_number":823,"context_line":"        return None"},{"line_number":824,"context_line":""},{"line_number":825,"context_line":"    def _find_external_subnet_by_port(self, port):"},{"line_number":826,"context_line":"        LOG.debug(\"Search external subnet by port to create local GW\")"},{"line_number":827,"context_line":"        routers \u003d self.nb_api.get_routers(port[\u0027tenant_id\u0027])"},{"line_number":828,"context_line":"        network_id \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_f2829551","line":825,"range":{"start_line":825,"start_character":8,"end_line":825,"end_character":37},"updated":"2017-02-12 08:24:02.000000000","message":"I am not sure I understand the logic here:\nThere is a single network/subnet from which ports are allocated, to tap into Neutron IP management.\n\nWouldn\u0027t it be simpler to name this network in configuration, and get it?\n\nWhy is that network tenant based?","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"01cf9df831090ad5982d64c53d72d84b25c32a41","unresolved":false,"context_lines":[{"line_number":822,"context_line":""},{"line_number":823,"context_line":"        return None"},{"line_number":824,"context_line":""},{"line_number":825,"context_line":"    def _find_external_subnet_by_port(self, port):"},{"line_number":826,"context_line":"        LOG.debug(\"Search external subnet by port to create local GW\")"},{"line_number":827,"context_line":"        routers \u003d self.nb_api.get_routers(port[\u0027tenant_id\u0027])"},{"line_number":828,"context_line":"        network_id \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_2d35aef6","line":825,"range":{"start_line":825,"start_character":8,"end_line":825,"end_character":37},"in_reply_to":"fa31d9ce_f2829551","updated":"2017-02-12 13:07:06.000000000","message":"I am not taking this assumption but lookup a router external info instead. This allows me less configuration to maintain","commit_id":"62d639f4e25ecce2bda81c07ee27092e8ffb5b5c"}]}
