)]}'
{"dragonflow/controller/dnat_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            return"},{"line_number":238,"context_line":"        arp_responder.ArpResponder(self,"},{"line_number":239,"context_line":"                                   None,"},{"line_number":240,"context_line":"                                   str(floatingip.ip_address),"},{"line_number":241,"context_line":"                                   floatingip.mac_address,"},{"line_number":242,"context_line":"                                   const.INGRESS_NAT_TABLE).add()"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_c8ad4332","line":240,"range":{"start_line":240,"start_character":35,"end_line":240,"end_character":38},"updated":"2017-04-26 08:51:30.000000000","message":"Is this needed?","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        parser \u003d self.parser"},{"line_number":273,"context_line":"        ofproto \u003d self.ofproto"},{"line_number":274,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":275,"context_line":"                                ipv4_dst\u003dstr(floatingip.ip_address))"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"        vm_mac, vm_ip, vm_tunnel_key, local_network_id \u003d \\"},{"line_number":278,"context_line":"            self._get_vm_port_info(floatingip)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_88a73b50","line":275,"range":{"start_line":275,"start_character":41,"end_line":275,"end_character":44},"updated":"2017-04-26 08:51:30.000000000","message":"Is this needed? I think ryu knows how to handle IPAddress objects.","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":541,"context_line":"    def _update_floatingip_gateway(self, fip, lswitch):"},{"line_number":542,"context_line":"        subnets \u003d lswitch.subnets"},{"line_number":543,"context_line":"        for subnet in subnets:"},{"line_number":544,"context_line":"            if str(subnet.cidr) \u003d\u003d fip.external_cidr:"},{"line_number":545,"context_line":"                # external gateway ip changed"},{"line_number":546,"context_line":"                if str(subnet.gateway_ip) !\u003d fip.external_gateway_ip:"},{"line_number":547,"context_line":"                    fip.external_gateway_ip \u003d subnet.gateway_ip"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_a808b72b","line":544,"range":{"start_line":544,"start_character":15,"end_line":544,"end_character":18},"updated":"2017-04-26 08:51:30.000000000","message":"Is this still needed?","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        for subnet in subnets:"},{"line_number":544,"context_line":"            if str(subnet.cidr) \u003d\u003d fip.external_cidr:"},{"line_number":545,"context_line":"                # external gateway ip changed"},{"line_number":546,"context_line":"                if str(subnet.gateway_ip) !\u003d fip.external_gateway_ip:"},{"line_number":547,"context_line":"                    fip.external_gateway_ip \u003d subnet.gateway_ip"},{"line_number":548,"context_line":"                    return fip"},{"line_number":549,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_8803bb0f","line":546,"range":{"start_line":546,"start_character":19,"end_line":546,"end_character":22},"updated":"2017-04-26 08:51:30.000000000","message":"Is this still needed?","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2e8d0e8f56f72b99d25d68a58e7b03b4fc2dc2e8","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                    fip_return.append(update_fip)"},{"line_number":528,"context_line":"        return fip_return"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def _update_floatingip_gateway(self, fip, lswitch):"},{"line_number":531,"context_line":"        subnets \u003d lswitch.subnets"},{"line_number":532,"context_line":"        for subnet in subnets:"},{"line_number":533,"context_line":"            if str(subnet.cidr) \u003d\u003d fip.get_external_cidr():"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_8d0d4840","side":"PARENT","line":530,"range":{"start_line":530,"start_character":8,"end_line":530,"end_character":34},"updated":"2017-05-30 12:52:40.000000000","message":"Has this case been considered?","commit_id":"f0b31df11e1fa6e70e78a019e6f787a313ef4bd4"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"27ae9c91f868c3e64e72302386a61bf207c69858","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                    fip_return.append(update_fip)"},{"line_number":528,"context_line":"        return fip_return"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def _update_floatingip_gateway(self, fip, lswitch):"},{"line_number":531,"context_line":"        subnets \u003d lswitch.subnets"},{"line_number":532,"context_line":"        for subnet in subnets:"},{"line_number":533,"context_line":"            if str(subnet.cidr) \u003d\u003d fip.get_external_cidr():"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_0e42db3e","side":"PARENT","line":530,"range":{"start_line":530,"start_character":8,"end_line":530,"end_character":34},"in_reply_to":"df140735_8d0d4840","updated":"2017-06-02 15:17:09.000000000","message":"No, but all the old code did was update the models, flows were not updated. I can add a TODO/bug for that","commit_id":"f0b31df11e1fa6e70e78a019e6f787a313ef4bd4"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2e8d0e8f56f72b99d25d68a58e7b03b4fc2dc2e8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"INGRESS \u003d \u0027ingress\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def _fip_status_by_lport(fip):"},{"line_number":50,"context_line":"    if fip.lport is None:"},{"line_number":51,"context_line":"        return n_const.FLOATINGIP_STATUS_DOWN"},{"line_number":52,"context_line":"    else:"},{"line_number":53,"context_line":"        return n_const.FLOATINGIP_STATUS_ACTIVE"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class DNATApp(df_base_app.DFlowApp):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_4d2e10a6","line":53,"range":{"start_line":49,"start_character":0,"end_line":53,"end_character":47},"updated":"2017-05-30 12:52:40.000000000","message":"should this be part of db model?","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"27ae9c91f868c3e64e72302386a61bf207c69858","unresolved":false,"context_lines":[{"line_number":46,"context_line":"INGRESS \u003d \u0027ingress\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def _fip_status_by_lport(fip):"},{"line_number":50,"context_line":"    if fip.lport is None:"},{"line_number":51,"context_line":"        return n_const.FLOATINGIP_STATUS_DOWN"},{"line_number":52,"context_line":"    else:"},{"line_number":53,"context_line":"        return n_const.FLOATINGIP_STATUS_ACTIVE"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class DNATApp(df_base_app.DFlowApp):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_eecd6785","line":53,"range":{"start_line":49,"start_character":0,"end_line":53,"end_character":47},"in_reply_to":"df140735_4d2e10a6","updated":"2017-06-02 15:17:09.000000000","message":"I\u0027m not sure it fits there, I think its pretty app-specific at this point","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2e8d0e8f56f72b99d25d68a58e7b03b4fc2dc2e8","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        match.set_ipv4_src(utils.ipv4_text_to_int(vm_ip))"},{"line_number":355,"context_line":"        return match"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def _get_floating_lport(self, fip):"},{"line_number":358,"context_line":"        # FIXME(dimak) Floating lports are not in DbStore because local"},{"line_number":359,"context_line":"        # controller ignores them, we should change this some-time"},{"line_number":360,"context_line":"        # FIXME (dimak) cache until above is done"},{"line_number":361,"context_line":"        return self.nb_api.get(l2.LogicalPort(id\u003dfip.floating_lport.id))"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def _get_external_subnet(self, fip):"},{"line_number":364,"context_line":"        floating_lport \u003d self._get_floating_lport(fip)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_6d7af424","line":361,"range":{"start_line":357,"start_character":0,"end_line":361,"end_character":72},"updated":"2017-05-30 12:52:40.000000000","message":"I don\u0027t know if it is good to add the lport that represents floatingip to Dbstore. It is a logic concept in neutron, without binding_host, and per my memory, its tenant_id is null. I kind of like the old way, which stores the attributes of lport in floatingip.","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"384175e8a48b5fa024f6339293f5170d21870ee2","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        match.set_ipv4_src(utils.ipv4_text_to_int(vm_ip))"},{"line_number":355,"context_line":"        return match"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def _get_floating_lport(self, fip):"},{"line_number":358,"context_line":"        # FIXME(dimak) Floating lports are not in DbStore because local"},{"line_number":359,"context_line":"        # controller ignores them, we should change this some-time"},{"line_number":360,"context_line":"        # FIXME (dimak) cache until above is done"},{"line_number":361,"context_line":"        return self.nb_api.get(l2.LogicalPort(id\u003dfip.floating_lport.id))"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def _get_external_subnet(self, fip):"},{"line_number":364,"context_line":"        floating_lport \u003d self._get_floating_lport(fip)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_8a7b25f3","line":361,"range":{"start_line":357,"start_character":0,"end_line":361,"end_character":72},"in_reply_to":"df140735_0e753b64","updated":"2017-06-06 12:34:24.000000000","message":"I think using virtual ports is all right - We already use them (e.g. DHCP), and they provide a known and acceptable interface that doesn\u0027t have to be repeated whenever something wants to look like a port (e.g. FIP, DHCP, maybe snat). With the use of foreign keys, looking up virtual ports is easy and non-intrusive.\n\nJust my 2 cents.","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"27ae9c91f868c3e64e72302386a61bf207c69858","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        match.set_ipv4_src(utils.ipv4_text_to_int(vm_ip))"},{"line_number":355,"context_line":"        return match"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def _get_floating_lport(self, fip):"},{"line_number":358,"context_line":"        # FIXME(dimak) Floating lports are not in DbStore because local"},{"line_number":359,"context_line":"        # controller ignores them, we should change this some-time"},{"line_number":360,"context_line":"        # FIXME (dimak) cache until above is done"},{"line_number":361,"context_line":"        return self.nb_api.get(l2.LogicalPort(id\u003dfip.floating_lport.id))"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def _get_external_subnet(self, fip):"},{"line_number":364,"context_line":"        floating_lport \u003d self._get_floating_lport(fip)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_0e753b64","line":361,"range":{"start_line":357,"start_character":0,"end_line":361,"end_character":72},"in_reply_to":"df140735_6d7af424","updated":"2017-06-02 15:17:09.000000000","message":"I think we can leverage reference fields and avoid holding duplicated data.\n\nI think the flow of updating gateway IP is a bit backwards, see we update the lswitch, then DNAT app on the local controller is responsible to update the model objects.\n\nI would not expect update_subnet() in mech_driver fetch all relevant FIPs and update them, and I would neither expect a controller app to write updates to the NB database.\n\nThis is why using references/foreign keys helps avoid updating data in dependent objects.","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2e8d0e8f56f72b99d25d68a58e7b03b4fc2dc2e8","unresolved":false,"context_lines":[{"line_number":513,"context_line":"        if old_status !\u003d new_status:"},{"line_number":514,"context_line":"            self.update_floatingip_status(fip, new_status)"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def associate_floatingip(self, floatingip):"},{"line_number":517,"context_line":"        self.local_floatingips[floatingip.id] \u003d floatingip"},{"line_number":518,"context_line":"        lport \u003d floatingip.lport"},{"line_number":519,"context_line":"        mac \u003d lport.mac"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_0d63781c","line":516,"range":{"start_line":516,"start_character":8,"end_line":516,"end_character":28},"updated":"2017-05-30 12:52:40.000000000","message":"this can be private, right?","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"27ae9c91f868c3e64e72302386a61bf207c69858","unresolved":false,"context_lines":[{"line_number":513,"context_line":"        if old_status !\u003d new_status:"},{"line_number":514,"context_line":"            self.update_floatingip_status(fip, new_status)"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def associate_floatingip(self, floatingip):"},{"line_number":517,"context_line":"        self.local_floatingips[floatingip.id] \u003d floatingip"},{"line_number":518,"context_line":"        lport \u003d floatingip.lport"},{"line_number":519,"context_line":"        mac \u003d lport.mac"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_4e1fb35a","line":516,"range":{"start_line":516,"start_character":8,"end_line":516,"end_character":28},"in_reply_to":"df140735_0d63781c","updated":"2017-06-02 15:17:09.000000000","message":"Yes, will change","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2e8d0e8f56f72b99d25d68a58e7b03b4fc2dc2e8","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        self._install_ingress_nat_rules(floatingip)"},{"line_number":522,"context_line":"        self._install_egress_nat_rules(floatingip)"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"    def disassociate_floatingip(self, floatingip):"},{"line_number":525,"context_line":"        self.local_floatingips.pop(floatingip.id, 0)"},{"line_number":526,"context_line":"        lport \u003d floatingip.lport"},{"line_number":527,"context_line":"        mac \u003d lport.mac"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_8d7668d8","line":524,"range":{"start_line":524,"start_character":8,"end_line":524,"end_character":31},"updated":"2017-05-30 12:52:40.000000000","message":"same comment here.","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"27ae9c91f868c3e64e72302386a61bf207c69858","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        self._install_ingress_nat_rules(floatingip)"},{"line_number":522,"context_line":"        self._install_egress_nat_rules(floatingip)"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"    def disassociate_floatingip(self, floatingip):"},{"line_number":525,"context_line":"        self.local_floatingips.pop(floatingip.id, 0)"},{"line_number":526,"context_line":"        lport \u003d floatingip.lport"},{"line_number":527,"context_line":"        mac \u003d lport.mac"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_2e247fae","line":524,"range":{"start_line":524,"start_character":8,"end_line":524,"end_character":31},"in_reply_to":"df140735_8d7668d8","updated":"2017-06-02 15:17:09.000000000","message":"Will change","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"36b02844da2c986d477b0d46662c1bc462d6eae1","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_DELETED)"},{"line_number":564,"context_line":"    def _remove_local_port(self, lport):"},{"line_number":565,"context_line":"        ips_to_disassociate \u003d ["},{"line_number":566,"context_line":"            fip for fip in self.local_floatingips.values()"},{"line_number":567,"context_line":"            if fip.lport.id \u003d\u003d lport.id]"},{"line_number":568,"context_line":"        for floatingip in ips_to_disassociate:"},{"line_number":569,"context_line":"            self._disassociate_floatingip(floatingip)"},{"line_number":570,"context_line":"            self.update_floatingip_status("}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_6197dc3b","line":567,"range":{"start_line":565,"start_character":30,"end_line":567,"end_character":40},"updated":"2017-06-06 11:44:59.000000000","message":"Maybe make a generator and not a list?\n\nIn a future patch, maybe make local_floatingips keyed by the associated lport ID (And the value a set)?","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d3c7056f7f63afc2d788e56a602c02d7d8c6ba13","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    @df_base_app.register_event(l2.LogicalPort, l2.EVENT_LOCAL_DELETED)"},{"line_number":564,"context_line":"    def _remove_local_port(self, lport):"},{"line_number":565,"context_line":"        ips_to_disassociate \u003d ["},{"line_number":566,"context_line":"            fip for fip in self.local_floatingips.values()"},{"line_number":567,"context_line":"            if fip.lport.id \u003d\u003d lport.id]"},{"line_number":568,"context_line":"        for floatingip in ips_to_disassociate:"},{"line_number":569,"context_line":"            self._disassociate_floatingip(floatingip)"},{"line_number":570,"context_line":"            self.update_floatingip_status("}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_7378c98e","line":567,"range":{"start_line":565,"start_character":30,"end_line":567,"end_character":40},"in_reply_to":"df140735_6197dc3b","updated":"2017-06-06 15:34:52.000000000","message":"Done,\n\nI want to drop local_floatingips altogether. That\u0027s what we have db_store for.","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"}],"dragonflow/db/models/l3.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    status \u003d fields.StringField()  # FIXME enum"},{"line_number":59,"context_line":"    floating_ip_address \u003d df_fields.IpAddressField()"},{"line_number":60,"context_line":"    floating_mac_address \u003d fields.StringField()"},{"line_number":61,"context_line":"    port_id \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":62,"context_line":"    fixed_ip_address \u003d df_fields.IpAddressField()"},{"line_number":63,"context_line":"    router_id \u003d df_fields.ReferenceField(LogicalRouter)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_337f7c68","line":60,"range":{"start_line":60,"start_character":0,"end_line":60,"end_character":47},"updated":"2017-04-26 08:51:30.000000000","message":"Why not df_fields.MacAddress?","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    external_gateway_ip \u003d df_fields.IpAddressField()"},{"line_number":65,"context_line":"    external_cidr \u003d df_fields.IpNetworkField()"},{"line_number":66,"context_line":"    floating_port_id \u003d df_fields.ReferenceField(l2.LogicalPort)"},{"line_number":67,"context_line":"    floating_network_id \u003d fields.StringField()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    # Renames"},{"line_number":70,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_f398f4c0","line":67,"range":{"start_line":67,"start_character":0,"end_line":67,"end_character":46},"updated":"2017-04-26 08:51:30.000000000","message":"Isn\u0027t this a reference to a network?","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    # Renames"},{"line_number":70,"context_line":"    @property"},{"line_number":71,"context_line":"    def lport(self):"},{"line_number":72,"context_line":"        return self.port_id"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @property"},{"line_number":75,"context_line":"    def lrouter(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_53ed6823","line":72,"range":{"start_line":72,"start_character":20,"end_line":72,"end_character":27},"updated":"2017-04-26 08:51:30.000000000","message":"Why not just call the fields by these names, and do away with the _id suffix?","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"80225283283d99657bf5f79b6a0d68fc8016c253","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                 mixins.UniqueKey, mixins.Name, mixins.BasicEvents):"},{"line_number":56,"context_line":"    table_name \u003d \u0027floatingip\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    status \u003d fields.StringField()  # FIXME enum"},{"line_number":59,"context_line":"    floating_ip_address \u003d df_fields.IpAddressField()"},{"line_number":60,"context_line":"    fixed_ip_address \u003d df_fields.IpAddressField()"},{"line_number":61,"context_line":"    lport \u003d df_fields.ReferenceField(l2.LogicalPort)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_779110f1","line":58,"range":{"start_line":58,"start_character":13,"end_line":58,"end_character":33},"updated":"2017-06-05 00:47:03.000000000","message":"https://github.com/openstack/neutron-lib/blob/master/neutron_lib/constants.py#L29-L31\n\nenum?","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f3eb24dd1465d973f2ef10faacdee60272b7956c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                 mixins.UniqueKey, mixins.Name, mixins.BasicEvents):"},{"line_number":56,"context_line":"    table_name \u003d \u0027floatingip\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    status \u003d fields.StringField()  # FIXME enum"},{"line_number":59,"context_line":"    floating_ip_address \u003d df_fields.IpAddressField()"},{"line_number":60,"context_line":"    fixed_ip_address \u003d df_fields.IpAddressField()"},{"line_number":61,"context_line":"    lport \u003d df_fields.ReferenceField(l2.LogicalPort)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_580ba28c","line":58,"range":{"start_line":58,"start_character":13,"end_line":58,"end_character":33},"in_reply_to":"df140735_779110f1","updated":"2017-06-06 15:28:24.000000000","message":"Done","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"36b02844da2c986d477b0d46662c1bc462d6eae1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                 mixins.UniqueKey, mixins.Name, mixins.BasicEvents):"},{"line_number":56,"context_line":"    table_name \u003d \u0027floatingip\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    status \u003d fields.StringField()  # FIXME enum"},{"line_number":59,"context_line":"    floating_ip_address \u003d df_fields.IpAddressField()"},{"line_number":60,"context_line":"    fixed_ip_address \u003d df_fields.IpAddressField()"},{"line_number":61,"context_line":"    lport \u003d df_fields.ReferenceField(l2.LogicalPort)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_216fa42b","line":58,"range":{"start_line":58,"start_character":33,"end_line":58,"end_character":47},"updated":"2017-06-06 11:44:59.000000000","message":"Why can\u0027t this be done in this patch?","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d3c7056f7f63afc2d788e56a602c02d7d8c6ba13","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                 mixins.UniqueKey, mixins.Name, mixins.BasicEvents):"},{"line_number":56,"context_line":"    table_name \u003d \u0027floatingip\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    status \u003d fields.StringField()  # FIXME enum"},{"line_number":59,"context_line":"    floating_ip_address \u003d df_fields.IpAddressField()"},{"line_number":60,"context_line":"    fixed_ip_address \u003d df_fields.IpAddressField()"},{"line_number":61,"context_line":"    lport \u003d df_fields.ReferenceField(l2.LogicalPort)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_aabee9aa","line":58,"range":{"start_line":58,"start_character":33,"end_line":58,"end_character":47},"in_reply_to":"df140735_216fa42b","updated":"2017-06-06 15:34:52.000000000","message":"Will do","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"}],"dragonflow/neutron/services/l3_router_plugin.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2e8d0e8f56f72b99d25d68a58e7b03b4fc2dc2e8","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return floating_ports[0]"},{"line_number":161,"context_line":"        return None"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def _get_floatingip_subnet(self, context, subnet_id):"},{"line_number":164,"context_line":"        gateway_subnet \u003d self.core_plugin.get_subnet(context, subnet_id)"},{"line_number":165,"context_line":"        if gateway_subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":166,"context_line":"            return gateway_subnet"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_28474a4e","line":163,"range":{"start_line":163,"start_character":8,"end_line":163,"end_character":30},"updated":"2017-05-30 12:52:40.000000000","message":"This is not used in the new version.","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"27ae9c91f868c3e64e72302386a61bf207c69858","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return floating_ports[0]"},{"line_number":161,"context_line":"        return None"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def _get_floatingip_subnet(self, context, subnet_id):"},{"line_number":164,"context_line":"        gateway_subnet \u003d self.core_plugin.get_subnet(context, subnet_id)"},{"line_number":165,"context_line":"        if gateway_subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":166,"context_line":"            return gateway_subnet"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_8a5d12eb","line":163,"range":{"start_line":163,"start_character":8,"end_line":163,"end_character":30},"in_reply_to":"df140735_28474a4e","updated":"2017-06-02 15:17:09.000000000","message":"Will drop","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2e8d0e8f56f72b99d25d68a58e7b03b4fc2dc2e8","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        self.nb_api.create("},{"line_number":198,"context_line":"            l3.FloatingIp("},{"line_number":199,"context_line":"                id\u003dfloatingip_dict[\u0027id\u0027],"},{"line_number":200,"context_line":"                topic\u003dfloatingip_dict[\u0027tenant_id\u0027],"},{"line_number":201,"context_line":"                name\u003dfloatingip_dict.get(\u0027name\u0027, df_const.DF_FIP_DEFAULT_NAME),"},{"line_number":202,"context_line":"                version\u003dfloatingip_dict[\u0027revision_number\u0027],"},{"line_number":203,"context_line":"                status\u003dfloatingip_dict[\u0027status\u0027],"},{"line_number":204,"context_line":"                floating_ip_address\u003dfloatingip_dict[\u0027floating_ip_address\u0027],"},{"line_number":205,"context_line":"                fixed_ip_address\u003dfloatingip_dict[\u0027fixed_ip_address\u0027],"},{"line_number":206,"context_line":"                lrouter\u003dfloatingip_dict[\u0027router_id\u0027],"},{"line_number":207,"context_line":"                lport\u003dfloatingip_dict[\u0027port_id\u0027],"},{"line_number":208,"context_line":"                floating_lport\u003dfloatingip_port[\u0027id\u0027],"},{"line_number":209,"context_line":"            ),"},{"line_number":210,"context_line":"            skip_send_event\u003d(\u0027port_id\u0027 not in floatingip_dict),"},{"line_number":211,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_e8edd225","line":208,"range":{"start_line":199,"start_character":0,"end_line":208,"end_character":53},"updated":"2017-05-30 12:52:40.000000000","message":"As my previous comment in dnat_app.py, I kind of like the old way, which stores some attributes of floatingip_lport to floatingip. Since this is a migration, I guess it is better to follow the old fashion with new nb db model. And do the optimization in another patch.","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"9ebbc803a0327a697a1adce9e52d86a51a52cb5a","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return floating_ports[0]"},{"line_number":161,"context_line":"        return None"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def _get_floatingip_subnet(self, context, subnet_id):"},{"line_number":164,"context_line":"        gateway_subnet \u003d self.core_plugin.get_subnet(context, subnet_id)"},{"line_number":165,"context_line":"        if gateway_subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":166,"context_line":"            return gateway_subnet"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_ff04e019","line":163,"range":{"start_line":163,"start_character":8,"end_line":163,"end_character":30},"updated":"2017-06-03 23:53:25.000000000","message":"still exist","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d3c7056f7f63afc2d788e56a602c02d7d8c6ba13","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return floating_ports[0]"},{"line_number":161,"context_line":"        return None"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def _get_floatingip_subnet(self, context, subnet_id):"},{"line_number":164,"context_line":"        gateway_subnet \u003d self.core_plugin.get_subnet(context, subnet_id)"},{"line_number":165,"context_line":"        if gateway_subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":166,"context_line":"            return gateway_subnet"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_788c2635","line":163,"range":{"start_line":163,"start_character":8,"end_line":163,"end_character":30},"in_reply_to":"df140735_ff04e019","updated":"2017-06-06 15:34:52.000000000","message":"Done","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"}],"dragonflow/tests/fullstack/test_neutron_api.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"36b02844da2c986d477b0d46662c1bc462d6eae1","unresolved":false,"context_lines":[{"line_number":723,"context_line":"        nb_bgp_speaker \u003d bgp_speaker.get_nb_bgp_speaker()"},{"line_number":724,"context_line":"        self.assertEqual(1, len(nb_bgp_speaker.host_routes))"},{"line_number":725,"context_line":"        self.assertIn("},{"line_number":726,"context_line":"            host_route.HostRoute(destination\u003dstr(fip_addr) + \u0027/32\u0027,"},{"line_number":727,"context_line":"                                 nexthop\u003d\u0027172.24.4.100\u0027),"},{"line_number":728,"context_line":"            nb_bgp_speaker.host_routes)"},{"line_number":729,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_64e80a7b","line":726,"range":{"start_line":726,"start_character":0,"end_line":726,"end_character":67},"updated":"2017-06-06 11:44:59.000000000","message":"nit: Maybe as: netaddr.IPNetwork(fip_addr)","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d3c7056f7f63afc2d788e56a602c02d7d8c6ba13","unresolved":false,"context_lines":[{"line_number":723,"context_line":"        nb_bgp_speaker \u003d bgp_speaker.get_nb_bgp_speaker()"},{"line_number":724,"context_line":"        self.assertEqual(1, len(nb_bgp_speaker.host_routes))"},{"line_number":725,"context_line":"        self.assertIn("},{"line_number":726,"context_line":"            host_route.HostRoute(destination\u003dstr(fip_addr) + \u0027/32\u0027,"},{"line_number":727,"context_line":"                                 nexthop\u003d\u0027172.24.4.100\u0027),"},{"line_number":728,"context_line":"            nb_bgp_speaker.host_routes)"},{"line_number":729,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_130aad1e","line":726,"range":{"start_line":726,"start_character":0,"end_line":726,"end_character":67},"in_reply_to":"df140735_64e80a7b","updated":"2017-06-06 15:34:52.000000000","message":"Done","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"}],"dragonflow/tests/unit/test_app_base.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"80225283283d99657bf5f79b6a0d68fc8016c253","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    name\u003d\u0027no_fip_name\u0027,"},{"line_number":289,"context_line":"    unique_key\u003d4444,"},{"line_number":290,"context_line":"    version\u003d7,"},{"line_number":291,"context_line":"    status\u003d\u0027DOWN\u0027,"},{"line_number":292,"context_line":"    floating_ip_address\u003d\u0027172.24.4.2\u0027,"},{"line_number":293,"context_line":"    fixed_ip_address\u003d\u002710.0.0.6\u0027,"},{"line_number":294,"context_line":"    lport\u003d\u0027fake_port1\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_97af0429","line":291,"range":{"start_line":291,"start_character":11,"end_line":291,"end_character":17},"updated":"2017-06-05 00:47:03.000000000","message":"https://github.com/openstack/neutron-lib/blob/master/neutron_lib/constants.py#L29-L31","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f3eb24dd1465d973f2ef10faacdee60272b7956c","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    name\u003d\u0027no_fip_name\u0027,"},{"line_number":289,"context_line":"    unique_key\u003d4444,"},{"line_number":290,"context_line":"    version\u003d7,"},{"line_number":291,"context_line":"    status\u003d\u0027DOWN\u0027,"},{"line_number":292,"context_line":"    floating_ip_address\u003d\u0027172.24.4.2\u0027,"},{"line_number":293,"context_line":"    fixed_ip_address\u003d\u002710.0.0.6\u0027,"},{"line_number":294,"context_line":"    lport\u003d\u0027fake_port1\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"df140735_f84036a7","line":291,"range":{"start_line":291,"start_character":11,"end_line":291,"end_character":17},"in_reply_to":"df140735_97af0429","updated":"2017-06-06 15:28:24.000000000","message":"Done","commit_id":"09a483c4a43cc3c678405207c2492293cd204306"}],"dragonflow/tests/unit/test_df_local_controller.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"36b02844da2c986d477b0d46662c1bc462d6eae1","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    apps_list \u003d \"l2_app.L2App\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _get_mock_floatingip(self, lport_id, fip_id):"},{"line_number":32,"context_line":"        return l3.FloatingIp("},{"line_number":33,"context_line":"            id\u003dfip_id,"},{"line_number":34,"context_line":"            lport\u003dlport_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_84c31eed","line":31,"updated":"2017-06-06 11:44:59.000000000","message":"Is this still used?","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d3c7056f7f63afc2d788e56a602c02d7d8c6ba13","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    apps_list \u003d \"l2_app.L2App\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _get_mock_floatingip(self, lport_id, fip_id):"},{"line_number":32,"context_line":"        return l3.FloatingIp("},{"line_number":33,"context_line":"            id\u003dfip_id,"},{"line_number":34,"context_line":"            lport\u003dlport_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_58c3a2ed","line":31,"in_reply_to":"df140735_84c31eed","updated":"2017-06-06 15:34:52.000000000","message":"Nope, will drop","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"}],"dragonflow/tests/unit/test_dnat_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"0c2cb3c700672e7b0bf53cc760ca74894fd93fcf","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        with mock.patch.object(self.controller, \u0027delete\u0027) as mock_func:"},{"line_number":88,"context_line":"            self.controller.topology.ovs_port_deleted("},{"line_number":89,"context_line":"                test_app_base.fake_ovs_port1.get_id())"},{"line_number":90,"context_line":"            raise RuntimeError(\u0027FIXME\u0027)"},{"line_number":91,"context_line":"        mock_func.assert_not_called()"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_b3c02c7d","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":39},"updated":"2017-04-26 08:51:30.000000000","message":"This looks wrong :)","commit_id":"cd09163c34c7e17af2f7ddafac314d1adc09f201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"36b02844da2c986d477b0d46662c1bc462d6eae1","unresolved":false,"context_lines":[{"line_number":46,"context_line":"remote_lport.is_local \u003d False"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def add_objs_to_db_store(*objs):"},{"line_number":50,"context_line":"    def decorator(func):"},{"line_number":51,"context_line":"        @functools.wraps(func)"},{"line_number":52,"context_line":"        def wrapper(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_841f9e6a","line":49,"updated":"2017-06-06 11:44:59.000000000","message":"Maybe move to utils? I think other tests could make use of this decorator.","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"d3c7056f7f63afc2d788e56a602c02d7d8c6ba13","unresolved":false,"context_lines":[{"line_number":46,"context_line":"remote_lport.is_local \u003d False"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def add_objs_to_db_store(*objs):"},{"line_number":50,"context_line":"    def decorator(func):"},{"line_number":51,"context_line":"        @functools.wraps(func)"},{"line_number":52,"context_line":"        def wrapper(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_589a8213","line":49,"in_reply_to":"df140735_841f9e6a","updated":"2017-06-06 15:34:52.000000000","message":"Done","commit_id":"27889017fb491349f520e7a7de06d1fcd8a52f9d"}]}
