)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"482fc3aefdfe4a85eb2a4b4ba01eea395d046f5a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     hujie \u003cmike.hu@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-17 21:07:33 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement remote port function for dragonflow"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I26f08895d120838455f39bbe3d021bca0e4de2e2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5a9d85d2_f610f1aa","line":7,"range":{"start_line":7,"start_character":45,"end_line":7,"end_character":45},"updated":"2016-06-20 00:30:45.000000000","message":"could you add more information about this function? Any BP or bug? I think we should follow this https://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"}],"dragonflow/controller/df_local_controller.py":[{"author":{"_account_id":16983,"name":"Eshed Gal-Or","email":"eshed.galor@huawei.com","username":"eshedg"},"change_message_id":"ed6cfdc9896eb07335d68dee0bb998bf6fb858cc","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        self.db_store.del_network_id(lswitch_id)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def _logical_port_process(self, lport, original_lport\u003dNone):"},{"line_number":197,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":198,"context_line":"        if chassis \u003d\u003d constants.DRAGONFLOW_VIRTUAL_PORT:"},{"line_number":199,"context_line":"            return"},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_2ee4380b","line":197,"updated":"2016-06-18 13:31:26.000000000","message":"the previous code checked for \"None\", which was removed here.","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f82aadcfb18c275625cda301edc5234f91be95d3","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        self.db_store.del_network_id(lswitch_id)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def _logical_port_process(self, lport, original_lport\u003dNone):"},{"line_number":197,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":198,"context_line":"        if chassis \u003d\u003d constants.DRAGONFLOW_VIRTUAL_PORT:"},{"line_number":199,"context_line":"            return"},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_1c920158","line":197,"in_reply_to":"5a9d85d2_9cd71123","updated":"2016-06-19 09:59:04.000000000","message":"yes, I have moved the None check outside of this method :)","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":21007,"name":"yuan wei","email":"wei.yuan@huawei.com","username":"yuanwei"},"change_message_id":"1d89ad1ac2f6912546045bef50dda5bcfa6eb9b2","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        self.db_store.del_network_id(lswitch_id)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def _logical_port_process(self, lport, original_lport\u003dNone):"},{"line_number":197,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":198,"context_line":"        if chassis \u003d\u003d constants.DRAGONFLOW_VIRTUAL_PORT:"},{"line_number":199,"context_line":"            return"},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_9cd71123","line":197,"in_reply_to":"7aa08908_2ee4380b","updated":"2016-06-19 09:28:27.000000000","message":"The None check has been moved to logical_port_created and logical_port_updated methods by which this _logical_port_process method is called.","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"482fc3aefdfe4a85eb2a4b4ba01eea395d046f5a","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        chassis_names \u003d chassis.split(\u0027:\u0027)"},{"line_number":254,"context_line":"        if len(chassis_names) \u003d\u003d 2 and chassis_names[0]\\"},{"line_number":255,"context_line":"                \u003d\u003d df_const.DF_REMOTE_CHASSIS_PREFIX:"},{"line_number":256,"context_line":"            return chassis_names[1]"},{"line_number":257,"context_line":"        return None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def _handle_remote_port_create(self, lport, host_ip):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_56ce2584","line":256,"range":{"start_line":256,"start_character":19,"end_line":256,"end_character":35},"updated":"2016-06-20 00:30:45.000000000","message":"Validating the format of chassis_names[1] could make it more robust","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"80fc0bb8d5a5124523fd9747ad43dc76c966a809","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        chassis_names \u003d chassis.split(\u0027:\u0027)"},{"line_number":254,"context_line":"        if len(chassis_names) \u003d\u003d 2 and chassis_names[0]\\"},{"line_number":255,"context_line":"                \u003d\u003d df_const.DF_REMOTE_CHASSIS_PREFIX:"},{"line_number":256,"context_line":"            return chassis_names[1]"},{"line_number":257,"context_line":"        return None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def _handle_remote_port_create(self, lport, host_ip):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_caa542b6","line":256,"range":{"start_line":256,"start_character":19,"end_line":256,"end_character":35},"in_reply_to":"5a9d85d2_56ce2584","updated":"2016-06-20 01:28:20.000000000","message":"ok, I\u0027ll check it as a normal ip addr","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":16983,"name":"Eshed Gal-Or","email":"eshed.galor@huawei.com","username":"eshedg"},"change_message_id":"ed6cfdc9896eb07335d68dee0bb998bf6fb858cc","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        if len(chassis_names) \u003d\u003d 2 and chassis_names[0]\\"},{"line_number":255,"context_line":"                \u003d\u003d df_const.DF_REMOTE_CHASSIS_PREFIX:"},{"line_number":256,"context_line":"            return chassis_names[1]"},{"line_number":257,"context_line":"        return None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def _handle_remote_port_create(self, lport, host_ip):"},{"line_number":260,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_0ed97c56","line":257,"updated":"2016-06-18 13:31:26.000000000","message":"i would consider adding a small check if len(chassis_names) \u003e 0, and a debug message, in case there is some bug elsewhere causing the chassis_names to malform","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f82aadcfb18c275625cda301edc5234f91be95d3","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        if len(chassis_names) \u003d\u003d 2 and chassis_names[0]\\"},{"line_number":255,"context_line":"                \u003d\u003d df_const.DF_REMOTE_CHASSIS_PREFIX:"},{"line_number":256,"context_line":"            return chassis_names[1]"},{"line_number":257,"context_line":"        return None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def _handle_remote_port_create(self, lport, host_ip):"},{"line_number":260,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_1cf5e182","line":257,"in_reply_to":"7aa08908_0ed97c56","updated":"2016-06-19 09:59:04.000000000","message":"I have checked the chassis is not None outside, could you please tell me why I should check len(chassis_names) \u003e 0? if the len !\u003d 2, None will be returned and the second case in if will not be excuted, and if the chassis_name is malform, I think the if phase will drop it, could you please give a simple example to describe the situation you worried, thx :)","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":16983,"name":"Eshed Gal-Or","email":"eshed.galor@huawei.com","username":"eshedg"},"change_message_id":"ed6cfdc9896eb07335d68dee0bb998bf6fb858cc","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def _handle_remote_port_create(self, lport, host_ip):"},{"line_number":260,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":261,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":262,"context_line":"        if not chassis_lports:"},{"line_number":263,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: host_ip,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_eeab5086","line":260,"updated":"2016-06-18 13:31:26.000000000","message":"consider checking that the value returned is valid","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f82aadcfb18c275625cda301edc5234f91be95d3","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return None"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def _handle_remote_port_create(self, lport, host_ip):"},{"line_number":260,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":261,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":262,"context_line":"        if not chassis_lports:"},{"line_number":263,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: host_ip,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_fc34554b","line":260,"in_reply_to":"7aa08908_eeab5086","updated":"2016-06-19 09:59:04.000000000","message":"I have checked the chassis_lport is not None, anything else to be checked?","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":21007,"name":"yuan wei","email":"wei.yuan@huawei.com","username":"yuanwei"},"change_message_id":"dd4a4bc9b116cf6ea98003b4190837dc9bea6800","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":262,"context_line":"        if not chassis_lports:"},{"line_number":263,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: host_ip,"},{"line_number":264,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":265,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":266,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"},{"line_number":267,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d set([lport.get_id()])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_1cf681d7","line":264,"updated":"2016-06-19 09:23:14.000000000","message":"Only support remote chassis with a same tunnel_type?","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f82aadcfb18c275625cda301edc5234f91be95d3","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":262,"context_line":"        if not chassis_lports:"},{"line_number":263,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: host_ip,"},{"line_number":264,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":265,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":266,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"},{"line_number":267,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d set([lport.get_id()])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_7c4985d0","line":264,"in_reply_to":"5a9d85d2_1cf681d7","updated":"2016-06-19 09:59:04.000000000","message":"yes, in current implementation","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"482fc3aefdfe4a85eb2a4b4ba01eea395d046f5a","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        else:"},{"line_number":269,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _handle_remote_port_delete(self, lport):"},{"line_number":272,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":273,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":274,"context_line":"        if chassis_lports is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_36ad5932","line":271,"range":{"start_line":271,"start_character":4,"end_line":271,"end_character":48},"updated":"2016-06-20 00:30:45.000000000","message":"Don\u0027t need to delete the tunnel created in _handle_remote_port_create?","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"80fc0bb8d5a5124523fd9747ad43dc76c966a809","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        else:"},{"line_number":269,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _handle_remote_port_delete(self, lport):"},{"line_number":272,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":273,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":274,"context_line":"        if chassis_lports is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_6a952e3f","line":271,"range":{"start_line":271,"start_character":4,"end_line":271,"end_character":48},"in_reply_to":"5a9d85d2_36ad5932","updated":"2016-06-20 01:28:20.000000000","message":"chassis_deleted() will do the tunnel delete...","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":16983,"name":"Eshed Gal-Or","email":"eshed.galor@huawei.com","username":"eshedg"},"change_message_id":"ed6cfdc9896eb07335d68dee0bb998bf6fb858cc","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _handle_remote_port_delete(self, lport):"},{"line_number":272,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":273,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":274,"context_line":"        if chassis_lports is None:"},{"line_number":275,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_8e9bac72","line":272,"updated":"2016-06-18 13:31:26.000000000","message":"consider checking that the value returned is valid","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f82aadcfb18c275625cda301edc5234f91be95d3","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _handle_remote_port_delete(self, lport):"},{"line_number":272,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":273,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":274,"context_line":"        if chassis_lports is None:"},{"line_number":275,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_dc399943","line":272,"in_reply_to":"7aa08908_8e9bac72","updated":"2016-06-19 09:59:04.000000000","message":"ditto","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"482fc3aefdfe4a85eb2a4b4ba01eea395d046f5a","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def logical_port_created(self, lport):"},{"line_number":282,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":283,"context_line":"        if chassis is None:"},{"line_number":284,"context_line":"            return"},{"line_number":285,"context_line":"        host_ip \u003d self._get_remote_port_host_ip(chassis)"},{"line_number":286,"context_line":"        if host_ip:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_961a4d16","line":283,"range":{"start_line":283,"start_character":9,"end_line":283,"end_character":27},"updated":"2016-06-20 00:30:45.000000000","message":"chassis also could be empty string","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"498ce5e3cb28edfb9c45053c1ff19243001cee1d","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def logical_port_created(self, lport):"},{"line_number":282,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":283,"context_line":"        if chassis is None:"},{"line_number":284,"context_line":"            return"},{"line_number":285,"context_line":"        host_ip \u003d self._get_remote_port_host_ip(chassis)"},{"line_number":286,"context_line":"        if host_ip:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_aadb961a","line":283,"range":{"start_line":283,"start_character":9,"end_line":283,"end_character":27},"in_reply_to":"5a9d85d2_8a9cda6a","updated":"2016-06-20 01:40:29.000000000","message":"yes. But self._logical_port_process(lport) should not be called if chassis is empty, otherwise it leads to a nonsense warning, refer to this bug https://bugs.launchpad.net/dragonflow/+bug/1594074","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"80fc0bb8d5a5124523fd9747ad43dc76c966a809","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def logical_port_created(self, lport):"},{"line_number":282,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":283,"context_line":"        if chassis is None:"},{"line_number":284,"context_line":"            return"},{"line_number":285,"context_line":"        host_ip \u003d self._get_remote_port_host_ip(chassis)"},{"line_number":286,"context_line":"        if host_ip:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_8a9cda6a","line":283,"range":{"start_line":283,"start_character":9,"end_line":283,"end_character":27},"in_reply_to":"5a9d85d2_961a4d16","updated":"2016-06-20 01:28:20.000000000","message":"empty string will be droped in the _get_remote_port_host_ip()","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":18903,"name":"Yuli","email":"stremovsky@gmail.com","username":"yuli"},"change_message_id":"73073a1b67ee8d0f320384488302a586f1ae8810","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":253,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":254,"context_line":"        if not chassis_lports:"},{"line_number":255,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: chassis,"},{"line_number":256,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":257,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":258,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a9d85d2_62a06ea0","line":255,"updated":"2016-06-21 10:58:58.000000000","message":"I suppose \u0027ip\u0027 value should point to ip.\n\nFor example this is what I have in chases table.\nIn my case \u0027id\u0027 is a name of the cases, ip is an ip.\n\n------------------------------------------------------------\nTable \u003d chassis\n------------------------------------------------------------\nKey \u003d ubuntu , Value \u003d {\"ip\": \"10.1.1.10\", \"id\": \"ubuntu\", \"tunnel_type\": \"geneve\"}","commit_id":"45b95c8ed7eafd726f653c3866f7bab95f7d94bd"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"5e01c32c37303bf9385500fab40ccca58e9ea573","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":253,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":254,"context_line":"        if not chassis_lports:"},{"line_number":255,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: chassis,"},{"line_number":256,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":257,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":258,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a9d85d2_5f55484e","line":255,"in_reply_to":"5a9d85d2_62a06ea0","updated":"2016-06-21 12:19:35.000000000","message":"yes, Yuli, the chassis passed from nb_api is just a ip, and here I choose the ip as the chassis_id too, because I think the remote vtep ip should be unique:), indeed when it write to ovsdb, if the ip is \"10.1.1.10\", the id should be \"df-10.1.1.10\"","commit_id":"45b95c8ed7eafd726f653c3866f7bab95f7d94bd"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"90e940bf630869741fe56da8a6bb33131f69d6fd","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":277,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":278,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"},{"line_number":279,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d set([lport.get_id()])"},{"line_number":280,"context_line":"        else:"},{"line_number":281,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_1ce71f13","line":279,"range":{"start_line":279,"start_character":53,"end_line":279,"end_character":74},"updated":"2016-09-01 03:46:31.000000000","message":"nit: you could just use {lport.get_id()}","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"692fd4dcb1cbf6fdcd22fb23657a92004aae295b","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":277,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":278,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"},{"line_number":279,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d set([lport.get_id()])"},{"line_number":280,"context_line":"        else:"},{"line_number":281,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_13160cf1","line":279,"range":{"start_line":279,"start_character":53,"end_line":279,"end_character":74},"in_reply_to":"fa7ab95a_1ce71f13","updated":"2016-09-01 14:05:33.000000000","message":"ok","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"45f663a60072b8a23e7b89b43e96cd1e93ef7e0c","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    def logical_port_created(self, lport):"},{"line_number":294,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":295,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":296,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort \") %"},{"line_number":297,"context_line":"                      lport.get_id())"},{"line_number":298,"context_line":"            return"},{"line_number":299,"context_line":"        if lport.get_remote_vtep():"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_55b0a3dd","line":296,"range":{"start_line":296,"start_character":67,"end_line":296,"end_character":68},"updated":"2016-08-31 23:29:38.000000000","message":"redundant space","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"90e940bf630869741fe56da8a6bb33131f69d6fd","unresolved":false,"context_lines":[{"line_number":303,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":304,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":305,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":306,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort \") %"},{"line_number":307,"context_line":"                      lport.get_id())"},{"line_number":308,"context_line":"            return"},{"line_number":309,"context_line":"        original_lport \u003d self.db_store.get_port(lport.get_id())"},{"line_number":310,"context_line":"        if not original_lport:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_f1c9c4ad","line":307,"range":{"start_line":306,"start_character":0,"end_line":307,"end_character":37},"updated":"2016-09-01 03:46:31.000000000","message":"If it appears multiple times, it would be better to just be in the method _is_valid_chassis.\n\nAnd try to use LOG.debug like this:\nLOG.debug(\"Port %s has not been bound or it is a vPort\", lport.get_id())","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"692fd4dcb1cbf6fdcd22fb23657a92004aae295b","unresolved":false,"context_lines":[{"line_number":303,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":304,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":305,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":306,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort \") %"},{"line_number":307,"context_line":"                      lport.get_id())"},{"line_number":308,"context_line":"            return"},{"line_number":309,"context_line":"        original_lport \u003d self.db_store.get_port(lport.get_id())"},{"line_number":310,"context_line":"        if not original_lport:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_33a150aa","line":307,"range":{"start_line":306,"start_character":0,"end_line":307,"end_character":37},"in_reply_to":"fa7ab95a_f1c9c4ad","updated":"2016-09-01 14:05:33.000000000","message":"ok, the code here is old for me, I remember I have put the log into the is_valid_chassis method before, thx:)","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"90e940bf630869741fe56da8a6bb33131f69d6fd","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            self.db_store.delete_port(lport.get_id(), False)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":341,"context_line":"        if chassis is None:"},{"line_number":342,"context_line":"            return"},{"line_number":343,"context_line":"        if lport.get_remote_vtep():"},{"line_number":344,"context_line":"            self._handle_remote_port_delete(lport)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_71fcd43e","line":342,"range":{"start_line":341,"start_character":0,"end_line":342,"end_character":18},"updated":"2016-09-01 03:46:31.000000000","message":"why not just use \"if not self._is_valid_chassis(chassis):\" here?","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"692fd4dcb1cbf6fdcd22fb23657a92004aae295b","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            self.db_store.delete_port(lport.get_id(), False)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":341,"context_line":"        if chassis is None:"},{"line_number":342,"context_line":"            return"},{"line_number":343,"context_line":"        if lport.get_remote_vtep():"},{"line_number":344,"context_line":"            self._handle_remote_port_delete(lport)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_73d118cd","line":342,"range":{"start_line":341,"start_character":0,"end_line":342,"end_character":18},"in_reply_to":"fa7ab95a_71fcd43e","updated":"2016-09-01 14:05:33.000000000","message":"if the lport has been stored into the db store, the chassis must be valid, indeed I could delete the judgement here, right?","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2b2da0cb9234cbe5469b400cdce305e771735772","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        self.db_store.del_lswitch(lswitch_id)"},{"line_number":212,"context_line":"        self.db_store.del_network_id(lswitch_id)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _is_valid_chassis(self, chassis):"},{"line_number":215,"context_line":"        if not chassis or chassis \u003d\u003d constants.DRAGONFLOW_VIRTUAL_PORT:"},{"line_number":216,"context_line":"            return False"},{"line_number":217,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_bfe78aaa","line":214,"updated":"2016-09-08 05:33:08.000000000","message":"Please rename to: _is_physical_chassis.\nIf the chassis is DRAGONFLOW_VIRTUAL_PORT, the chassis is virtual, but still valid.","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"7f24241ff6655750217b852f49773052c4a2773c","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        self.db_store.del_lswitch(lswitch_id)"},{"line_number":212,"context_line":"        self.db_store.del_network_id(lswitch_id)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _is_valid_chassis(self, chassis):"},{"line_number":215,"context_line":"        if not chassis or chassis \u003d\u003d constants.DRAGONFLOW_VIRTUAL_PORT:"},{"line_number":216,"context_line":"            return False"},{"line_number":217,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_2f561a2a","line":214,"in_reply_to":"9a89bdaa_bfe78aaa","updated":"2016-09-13 03:33:33.000000000","message":"ok","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2b2da0cb9234cbe5469b400cdce305e771735772","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                LOG.warning(_LW(\"No tunnel for remote logical port %s\") %"},{"line_number":279,"context_line":"                            str(lport))"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def _handle_remote_port_create(self, lport):"},{"line_number":282,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":283,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":284,"context_line":"        if not chassis_lports:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_5f53de38","line":281,"updated":"2016-09-08 05:33:08.000000000","message":"nit: Consider renaming to explain what the method does, rather than when it should be called. e.g. \u0027_add_tunnel_to_lport_chassis\u0027","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f9539bf9033ba5b3846717e505768c07f7207f22","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                LOG.warning(_LW(\"No tunnel for remote logical port %s\") %"},{"line_number":279,"context_line":"                            str(lport))"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def _handle_remote_port_create(self, lport):"},{"line_number":282,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":283,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":284,"context_line":"        if not chassis_lports:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_d708db82","line":281,"in_reply_to":"9a89bdaa_1ff5ffeb","updated":"2016-09-13 08:53:09.000000000","message":"ok, I\u0027ll try:)","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"7f24241ff6655750217b852f49773052c4a2773c","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                LOG.warning(_LW(\"No tunnel for remote logical port %s\") %"},{"line_number":279,"context_line":"                            str(lport))"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def _handle_remote_port_create(self, lport):"},{"line_number":282,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":283,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":284,"context_line":"        if not chassis_lports:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_6f64a221","line":281,"in_reply_to":"9a89bdaa_5f53de38","updated":"2016-09-13 03:33:33.000000000","message":"Not all the remote port create will cause tunnel create, only the first remote port on the chassis will lead to the tunnel creation.","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"16570e01d383029787848f64f48aa142a1a0f17c","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                LOG.warning(_LW(\"No tunnel for remote logical port %s\") %"},{"line_number":279,"context_line":"                            str(lport))"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def _handle_remote_port_create(self, lport):"},{"line_number":282,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":283,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":284,"context_line":"        if not chassis_lports:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_1ff5ffeb","line":281,"in_reply_to":"9a89bdaa_6f64a221","updated":"2016-09-13 06:28:29.000000000","message":"Then maybe _add_tunnel_to_lport_chassis_on_first ? Or _realize_tunnel_to_lport_chassis?","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2b2da0cb9234cbe5469b400cdce305e771735772","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        if not chassis_lports:"},{"line_number":285,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: chassis,"},{"line_number":286,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":287,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":288,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"},{"line_number":289,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            chassis_lports.add(lport.get_id())"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_5fa59e44","line":288,"range":{"start_line":287,"start_character":45,"end_line":288,"end_character":51},"updated":"2016-09-08 05:33:08.000000000","message":"nit: I think it will be clearer to create the Chassis object in a separate line, e.g.:\nchassis_inst \u003d api_nb.Chassis(jsonutils.dumps(chassis_value))\nself.vswitch_api.add_tunnel_port(chassis_inst).execute()\n\nBoth lines are shorter than 68 bytes, so you won\u0027t need a line break in the middle of the command.","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"7f24241ff6655750217b852f49773052c4a2773c","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        if not chassis_lports:"},{"line_number":285,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: chassis,"},{"line_number":286,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":287,"context_line":"            self.vswitch_api.add_tunnel_port(api_nb.Chassis("},{"line_number":288,"context_line":"                    jsonutils.dumps(chassis_value))).execute()"},{"line_number":289,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            chassis_lports.add(lport.get_id())"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_af414a65","line":288,"range":{"start_line":287,"start_character":45,"end_line":288,"end_character":51},"in_reply_to":"9a89bdaa_5fa59e44","updated":"2016-09-13 03:33:33.000000000","message":"ok","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2b2da0cb9234cbe5469b400cdce305e771735772","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def _handle_remote_port_delete(self, lport):"},{"line_number":294,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":295,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":296,"context_line":"        if chassis_lports is None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_bf3a2ae5","line":293,"updated":"2016-09-08 05:33:08.000000000","message":"Nit: Same here re: renaming. (e.g. \u0027_remove_tunnel_to_lport_chassis\u0027","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"7f24241ff6655750217b852f49773052c4a2773c","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def _handle_remote_port_delete(self, lport):"},{"line_number":294,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":295,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":296,"context_line":"        if chassis_lports is None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_cf468e7a","line":293,"in_reply_to":"9a89bdaa_bf3a2ae5","updated":"2016-09-13 03:33:33.000000000","message":"only last remote port delete will lead to tunnel delete","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"16570e01d383029787848f64f48aa142a1a0f17c","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def _handle_remote_port_delete(self, lport):"},{"line_number":294,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":295,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":296,"context_line":"        if chassis_lports is None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_5f1ea70c","line":293,"in_reply_to":"9a89bdaa_cf468e7a","updated":"2016-09-13 06:28:29.000000000","message":"Then maybe _cleanup_tunnel_to_lport_chassis ? or_remove_tunnel_to_lport_on_last? (Make sure it matches with the create function above thought)...","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2b2da0cb9234cbe5469b400cdce305e771735772","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":314,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":315,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":316,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":317,"context_line":"                      lport.get_id())"},{"line_number":318,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_5a2f6c87","line":315,"updated":"2016-09-08 05:33:08.000000000","message":"Is it possible that an lport\u0027s binding is removed? i.e. It was bound to RemoteChassis:x, and now it\u0027s bound to \u0027\u0027?","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d14e8570806cfb4f5fb53131f58a1b301afe12dd","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":314,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":315,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":316,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":317,"context_line":"                      lport.get_id())"},{"line_number":318,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_79a45e4a","line":315,"in_reply_to":"9a89bdaa_4a1d02bd","updated":"2016-09-13 09:55:38.000000000","message":"Good enough :)","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"7f24241ff6655750217b852f49773052c4a2773c","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":314,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":315,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":316,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":317,"context_line":"                      lport.get_id())"},{"line_number":318,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_cb520113","line":315,"in_reply_to":"9a89bdaa_5a2f6c87","updated":"2016-09-13 03:33:33.000000000","message":"I think if the lport wants to communicate with other lports, it should have a physical chassis(vtep func), so if the binding is removed, we should not process it.","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"16570e01d383029787848f64f48aa142a1a0f17c","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":314,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":315,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":316,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":317,"context_line":"                      lport.get_id())"},{"line_number":318,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_df52b712","line":315,"in_reply_to":"9a89bdaa_cb520113","updated":"2016-09-13 06:28:29.000000000","message":"If the binding is removed, shouldn\u0027t we remove the tunnel (if this was the last port?)","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f9539bf9033ba5b3846717e505768c07f7207f22","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":314,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":315,"context_line":"        if not self._is_valid_chassis(chassis):"},{"line_number":316,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":317,"context_line":"                      lport.get_id())"},{"line_number":318,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_4a1d02bd","line":315,"in_reply_to":"9a89bdaa_df52b712","updated":"2016-09-13 08:53:09.000000000","message":"In the previous code before the remote port feature, we did nothing when chassis changed from xxx to \u0027\u0027 in the lport_update api, so in remote port feature, we also ignore this scenario, indeed we can clear the tunnel port and flow entries when in the lport_deleted api which indicate that the lport is truely deleted. If the lport is not deleted and the binding is removed, I think the common scenario is VM shutdown :)","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"6a243a025aac1f082eb21255e1a187f3e0ff9c32","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                            str(lport))"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def _add_remote_port_on_chassis(self, lport):"},{"line_number":281,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":282,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":283,"context_line":"        if not chassis_lports:"},{"line_number":284,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: chassis,"},{"line_number":285,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":286,"context_line":"            chassis_inst \u003d api_nb.Chassis(jsonutils.dumps(chassis_value))"},{"line_number":287,"context_line":"            self.vswitch_api.add_tunnel_port(chassis_inst).execute()"},{"line_number":288,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def _delete_remote_port_from_chassis(self, lport):"},{"line_number":293,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_55e8b4e2","line":290,"range":{"start_line":281,"start_character":0,"end_line":290,"end_character":46},"updated":"2016-09-23 03:19:37.000000000","message":"I think you can use chassis_created here. So that when df_controller restarts, and remote_chassis_lport_map is empty, you will not create duplicated tunnel_port.","commit_id":"58f6a7f69d9d32d3909961a8f1da6e8c4f851ddb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"d4f577a46c261fe52d28fbb5e8a9873821c522de","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                            str(lport))"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def _add_remote_port_on_chassis(self, lport):"},{"line_number":281,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":282,"context_line":"        chassis_lports \u003d self.remote_chassis_lport_map.get(chassis)"},{"line_number":283,"context_line":"        if not chassis_lports:"},{"line_number":284,"context_line":"            chassis_value \u003d {\u0027id\u0027: chassis, \u0027ip\u0027: chassis,"},{"line_number":285,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":286,"context_line":"            chassis_inst \u003d api_nb.Chassis(jsonutils.dumps(chassis_value))"},{"line_number":287,"context_line":"            self.vswitch_api.add_tunnel_port(chassis_inst).execute()"},{"line_number":288,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def _delete_remote_port_from_chassis(self, lport):"},{"line_number":293,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_14f2a56f","line":290,"range":{"start_line":281,"start_character":0,"end_line":290,"end_character":46},"in_reply_to":"5a8bc5a2_55e8b4e2","updated":"2016-09-23 08:21:43.000000000","message":"I think I can use chassis_created when I decide to create a tunnel port as the first remote port on the chassis online as you suggest to avoid to create duplicated port, but I must maintain the remote_chassis_lport_map to store the remote ports info on the specific chassis, and when the last remote port gone I must delete the corresponding tunnel port.","commit_id":"58f6a7f69d9d32d3909961a8f1da6e8c4f851ddb"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"6a243a025aac1f082eb21255e1a187f3e0ff9c32","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        chassis_lports.remove(lport.get_id())"},{"line_number":298,"context_line":"        if len(chassis_lports) \u003d\u003d 0:"},{"line_number":299,"context_line":"            self.chassis_deleted(chassis)"},{"line_number":300,"context_line":"            del self.remote_chassis_lport_map[chassis]"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def logical_port_created(self, lport):"},{"line_number":303,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_3824fdad","line":300,"range":{"start_line":300,"start_character":0,"end_line":300,"end_character":54},"updated":"2016-09-23 03:19:37.000000000","message":"This is not required","commit_id":"58f6a7f69d9d32d3909961a8f1da6e8c4f851ddb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"d4f577a46c261fe52d28fbb5e8a9873821c522de","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        chassis_lports.remove(lport.get_id())"},{"line_number":298,"context_line":"        if len(chassis_lports) \u003d\u003d 0:"},{"line_number":299,"context_line":"            self.chassis_deleted(chassis)"},{"line_number":300,"context_line":"            del self.remote_chassis_lport_map[chassis]"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def logical_port_created(self, lport):"},{"line_number":303,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_b4fd713c","line":300,"range":{"start_line":300,"start_character":0,"end_line":300,"end_character":54},"in_reply_to":"5a8bc5a2_3824fdad","updated":"2016-09-23 08:21:43.000000000","message":"just delete the duplicated data","commit_id":"58f6a7f69d9d32d3909961a8f1da6e8c4f851ddb"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"6a243a025aac1f082eb21255e1a187f3e0ff9c32","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":313,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":314,"context_line":"        if not self._is_physical_chassis(chassis):"},{"line_number":315,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":316,"context_line":"                      lport.get_id())"},{"line_number":317,"context_line":"            return"},{"line_number":318,"context_line":"        original_lport \u003d self.db_store.get_port(lport.get_id())"},{"line_number":319,"context_line":"        if not original_lport:"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_9856f1d0","line":316,"range":{"start_line":315,"start_character":0,"end_line":316,"end_character":37},"updated":"2016-09-23 03:19:37.000000000","message":"why not just move this log into _is_physical_chassis?","commit_id":"58f6a7f69d9d32d3909961a8f1da6e8c4f851ddb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"d4f577a46c261fe52d28fbb5e8a9873821c522de","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    def logical_port_updated(self, lport):"},{"line_number":313,"context_line":"        chassis \u003d lport.get_chassis()"},{"line_number":314,"context_line":"        if not self._is_physical_chassis(chassis):"},{"line_number":315,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":316,"context_line":"                      lport.get_id())"},{"line_number":317,"context_line":"            return"},{"line_number":318,"context_line":"        original_lport \u003d self.db_store.get_port(lport.get_id())"},{"line_number":319,"context_line":"        if not original_lport:"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_54718ddf","line":316,"range":{"start_line":315,"start_character":0,"end_line":316,"end_character":37},"in_reply_to":"5a8bc5a2_9856f1d0","updated":"2016-09-23 08:21:43.000000000","message":"the _is_physical_chassis method only has chassis arg, do you mean I should modify the log content? If so, it\u0027s ok:)","commit_id":"58f6a7f69d9d32d3909961a8f1da6e8c4f851ddb"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b4ab4c961e134cc7994fe77a8ef0724f98ee1b20","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":286,"context_line":"            chassis_inst \u003d api_nb.Chassis(jsonutils.dumps(chassis_value))"},{"line_number":287,"context_line":"            self.chassis_created(chassis_inst)"},{"line_number":288,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_b0faafbb","line":288,"range":{"start_line":288,"start_character":53,"end_line":288,"end_character":69},"updated":"2016-09-24 01:30:08.000000000","message":"dict?","commit_id":"5ac47e26367b0b56c9e0e34c4fb405c3ff5a1429"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"3f38053aee1568e0dfd2f976a29419c9ccc8c8af","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                             \u0027tunnel_type\u0027: self.tunnel_type}"},{"line_number":286,"context_line":"            chassis_inst \u003d api_nb.Chassis(jsonutils.dumps(chassis_value))"},{"line_number":287,"context_line":"            self.chassis_created(chassis_inst)"},{"line_number":288,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_10c1a32e","line":288,"range":{"start_line":288,"start_character":53,"end_line":288,"end_character":69},"in_reply_to":"5a8bc5a2_b0faafbb","updated":"2016-09-24 01:45:28.000000000","message":"no, it\u0027s a set :)","commit_id":"5ac47e26367b0b56c9e0e34c4fb405c3ff5a1429"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b4ab4c961e134cc7994fe77a8ef0724f98ee1b20","unresolved":false,"context_lines":[{"line_number":287,"context_line":"            self.chassis_created(chassis_inst)"},{"line_number":288,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def _delete_remote_port_from_chassis(self, lport):"},{"line_number":293,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_9013f30c","line":290,"range":{"start_line":290,"start_character":12,"end_line":290,"end_character":26},"updated":"2016-09-24 01:30:08.000000000","message":"chassis_lports is dict above, how could call add() to a dict? I think it should be a set.","commit_id":"5ac47e26367b0b56c9e0e34c4fb405c3ff5a1429"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"3f38053aee1568e0dfd2f976a29419c9ccc8c8af","unresolved":false,"context_lines":[{"line_number":287,"context_line":"            self.chassis_created(chassis_inst)"},{"line_number":288,"context_line":"            self.remote_chassis_lport_map[chassis] \u003d {lport.get_id()}"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            chassis_lports.add(lport.get_id())"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def _delete_remote_port_from_chassis(self, lport):"},{"line_number":293,"context_line":"        chassis \u003d lport.get_chassis()"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_30de9f11","line":290,"range":{"start_line":290,"start_character":12,"end_line":290,"end_character":26},"in_reply_to":"5a8bc5a2_9013f30c","updated":"2016-09-24 01:45:28.000000000","message":"ditto","commit_id":"5ac47e26367b0b56c9e0e34c4fb405c3ff5a1429"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"5aa007ef575587e901b84282f86a2c5e9857e495","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.topology \u003d None"},{"line_number":80,"context_line":"        self.enable_selective_topo_dist \u003d \\"},{"line_number":81,"context_line":"            cfg.CONF.df.enable_selective_topology_distribution"},{"line_number":82,"context_line":"        self.remote_chassis_lport_map \u003d {}"},{"line_number":83,"context_line":"        self.integration_bridge \u003d cfg.CONF.df.integration_bridge"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def run(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_e4e8f512","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":42},"updated":"2016-09-24 07:38:31.000000000","message":"Since it is a local cache, I think it should be in db_store. But I am ok it is in a follow patch.","commit_id":"e2bdb1aa6b08d7ea4d739b2d4fa3d49d5ec4e2fe"}],"dragonflow/db/api_nb.py":[{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"45f663a60072b8a23e7b89b43e96cd1e93ef7e0c","unresolved":false,"context_lines":[{"line_number":922,"context_line":"        return self.lport[\u0027version\u0027]"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    def get_remote_vtep(self):"},{"line_number":925,"context_line":"        return self.lport[\u0027remote_vtep\u0027]"},{"line_number":926,"context_line":""},{"line_number":927,"context_line":"    def __str__(self):"},{"line_number":928,"context_line":"        return self.lport.__str__() + self.external_dict.__str__()"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_352ebffa","line":925,"range":{"start_line":925,"start_character":25,"end_line":925,"end_character":40},"updated":"2016-08-31 23:29:38.000000000","message":"it\u0027s better to use get method","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"}],"dragonflow/neutron/common/constants.py":[{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"482fc3aefdfe4a85eb2a4b4ba01eea395d046f5a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"DF_PORT_DEFAULT_NAME \u003d \u0027no_port_name\u0027"},{"line_number":19,"context_line":"DF_ROUTER_DEFAULT_NAME \u003d \u0027no_router_name\u0027"},{"line_number":20,"context_line":"DF_FIP_DEFAULT_NAME \u003d \u0027no_fip_name\u0027"},{"line_number":21,"context_line":"DF_REMOTE_CHASSIS_PREFIX \u003d \u0027remote_chassis\u0027"},{"line_number":22,"context_line":"DF_REMOTE_PORT_TYPE \u003d \u0027remote_port\u0027"},{"line_number":23,"context_line":"BINDING_PROFILE_PORT_KEY \u003d \u0027port_key\u0027"},{"line_number":24,"context_line":"BINDING_PROFILE_HOST_IP \u003d \u0027host_ip\u0027"},{"line_number":25,"context_line":"DF_PORT_BINDING_PROFILE \u003d portbindings.PROFILE"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_96f1add0","line":22,"range":{"start_line":21,"start_character":3,"end_line":22,"end_character":35},"updated":"2016-06-20 00:30:45.000000000","message":"I suggest add a prefix, such as \u0027df_\u0027 to these strings to avoid some potential naming issues","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"18b24ff89fa626dea0b649cde8e3db697b37a753","unresolved":false,"context_lines":[{"line_number":18,"context_line":"DF_PORT_DEFAULT_NAME \u003d \u0027no_port_name\u0027"},{"line_number":19,"context_line":"DF_ROUTER_DEFAULT_NAME \u003d \u0027no_router_name\u0027"},{"line_number":20,"context_line":"DF_FIP_DEFAULT_NAME \u003d \u0027no_fip_name\u0027"},{"line_number":21,"context_line":"DF_REMOTE_CHASSIS_PREFIX \u003d \u0027remote_chassis\u0027"},{"line_number":22,"context_line":"DF_REMOTE_PORT_TYPE \u003d \u0027remote_port\u0027"},{"line_number":23,"context_line":"BINDING_PROFILE_PORT_KEY \u003d \u0027port_key\u0027"},{"line_number":24,"context_line":"BINDING_PROFILE_HOST_IP \u003d \u0027host_ip\u0027"},{"line_number":25,"context_line":"DF_PORT_BINDING_PROFILE \u003d portbindings.PROFILE"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_8aaa1a6f","line":22,"range":{"start_line":21,"start_character":3,"end_line":22,"end_character":35},"in_reply_to":"5a9d85d2_96f1add0","updated":"2016-06-20 01:35:46.000000000","message":"the name in the binding_profile field could be reused by other cloud OS, so the content could have no df_ prefix","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"482fc3aefdfe4a85eb2a4b4ba01eea395d046f5a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"DF_FIP_DEFAULT_NAME \u003d \u0027no_fip_name\u0027"},{"line_number":21,"context_line":"DF_REMOTE_CHASSIS_PREFIX \u003d \u0027remote_chassis\u0027"},{"line_number":22,"context_line":"DF_REMOTE_PORT_TYPE \u003d \u0027remote_port\u0027"},{"line_number":23,"context_line":"BINDING_PROFILE_PORT_KEY \u003d \u0027port_key\u0027"},{"line_number":24,"context_line":"BINDING_PROFILE_HOST_IP \u003d \u0027host_ip\u0027"},{"line_number":25,"context_line":"DF_PORT_BINDING_PROFILE \u003d portbindings.PROFILE"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_f613d10b","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":35},"updated":"2016-06-20 00:30:45.000000000","message":"Why don\u0027t these two constants start with \u0027DF_\u0027?","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"18b24ff89fa626dea0b649cde8e3db697b37a753","unresolved":false,"context_lines":[{"line_number":20,"context_line":"DF_FIP_DEFAULT_NAME \u003d \u0027no_fip_name\u0027"},{"line_number":21,"context_line":"DF_REMOTE_CHASSIS_PREFIX \u003d \u0027remote_chassis\u0027"},{"line_number":22,"context_line":"DF_REMOTE_PORT_TYPE \u003d \u0027remote_port\u0027"},{"line_number":23,"context_line":"BINDING_PROFILE_PORT_KEY \u003d \u0027port_key\u0027"},{"line_number":24,"context_line":"BINDING_PROFILE_HOST_IP \u003d \u0027host_ip\u0027"},{"line_number":25,"context_line":"DF_PORT_BINDING_PROFILE \u003d portbindings.PROFILE"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_6aa36e9f","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":35},"in_reply_to":"5a9d85d2_f613d10b","updated":"2016-06-20 01:35:46.000000000","message":"ok","commit_id":"d0cb26bca8916a8ac8eddcd0f0485668688eee18"}],"dragonflow/neutron/ml2/mech_driver.py":[{"author":{"_account_id":21007,"name":"yuan wei","email":"wei.yuan@huawei.com","username":"yuanwei"},"change_message_id":"fff2add71d20c69dbbb29318d091866166f01a98","unresolved":false,"context_lines":[{"line_number":446,"context_line":"        binding_profile \u003d port.get(\u0027binding:profile\u0027)"},{"line_number":447,"context_line":"        remote_vtep \u003d None"},{"line_number":448,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":449,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":450,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":451,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":452,"context_line":"            remote_vtep \u003d chassis"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_10d28600","line":449,"updated":"2016-07-11 09:07:33.000000000","message":"Why the \u0027remote_port_type\u0027 column is needed, it\u0027s a constant vlaue, why not only use \u0027remote_host_ip\u0027 and check if it is None?","commit_id":"b79db84167ec0854cc629c583ace54cb2f3c4cda"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"9b9bfe349402948bf022d972397be39f2ea4bada","unresolved":false,"context_lines":[{"line_number":446,"context_line":"        binding_profile \u003d port.get(\u0027binding:profile\u0027)"},{"line_number":447,"context_line":"        remote_vtep \u003d None"},{"line_number":448,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":449,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":450,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":451,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":452,"context_line":"            remote_vtep \u003d chassis"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_e2c7f40f","line":449,"in_reply_to":"1aa78d24_10d28600","updated":"2016-07-12 09:10:44.000000000","message":"the \"port_key\":\"remote_port\" is the key identify of remote port:)","commit_id":"b79db84167ec0854cc629c583ace54cb2f3c4cda"},{"author":{"_account_id":21007,"name":"yuan wei","email":"wei.yuan@huawei.com","username":"yuanwei"},"change_message_id":"fff2add71d20c69dbbb29318d091866166f01a98","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":449,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":450,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":451,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":452,"context_line":"            remote_vtep \u003d chassis"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        self.nb_api.create_lport("}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_105f2642","line":451,"updated":"2016-07-11 09:07:33.000000000","message":"if we can remain the chassis value being host_id, and only add the new comlumn remote_vetp? when local controller finds out there is no tunnel to the host with that host_id, it can create one using the remote_vtep.","commit_id":"b79db84167ec0854cc629c583ace54cb2f3c4cda"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"9b9bfe349402948bf022d972397be39f2ea4bada","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":449,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":450,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":451,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":452,"context_line":"            remote_vtep \u003d chassis"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        self.nb_api.create_lport("}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_28ad5b84","line":451,"in_reply_to":"1aa78d24_105f2642","updated":"2016-07-12 09:10:44.000000000","message":"We use remote vtep ip as the chassis of remote port and remote_vtep is used for judging it\u0027s a remote port.","commit_id":"b79db84167ec0854cc629c583ace54cb2f3c4cda"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2b2da0cb9234cbe5469b400cdce305e771735772","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":487,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":488,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":489,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":490,"context_line":"            remote_vtep \u003d chassis"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        self.nb_api.create_lport("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_daf53ced","line":489,"updated":"2016-09-08 05:33:08.000000000","message":"From the spec, I understood the chassis is supposed to be: RemoteChassis:\u003cremote_vtep\u003e ?","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"16570e01d383029787848f64f48aa142a1a0f17c","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":487,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":488,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":489,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":490,"context_line":"            remote_vtep \u003d chassis"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        self.nb_api.create_lport("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_7fee0bee","line":489,"in_reply_to":"9a89bdaa_0badc99a","updated":"2016-09-13 06:28:29.000000000","message":"All right.\n\nOut of curiosity, do you have a link to the relevant code or something?","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"f9539bf9033ba5b3846717e505768c07f7207f22","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":487,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":488,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":489,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":490,"context_line":"            remote_vtep \u003d chassis"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        self.nb_api.create_lport("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_0ddeb46c","line":489,"in_reply_to":"9a89bdaa_7fee0bee","updated":"2016-09-13 08:53:09.000000000","message":"We found the issue when we test it in our environment, maybe we could find the answer in the ovsdb protocol :)","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"7f24241ff6655750217b852f49773052c4a2773c","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":487,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":488,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":489,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":490,"context_line":"            remote_vtep \u003d chassis"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        self.nb_api.create_lport("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_0badc99a","line":489,"in_reply_to":"9a89bdaa_daf53ced","updated":"2016-09-13 03:33:33.000000000","message":"yes, in previous design it is, but in the test we found when we create a tunnel port to the remote chassis, the port_name of the tunnel port is limited to 32 bit length, so in order to identify a unique tunnel port, we delete the RemoteChassis: prefix and just make the remote vtep ip as the chassis_id, and it\u0027s unique too, I\u0027ll modify the spec soon, thx:)","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"974377ef4a865f1631a6ee52a5a162495b8962ea","unresolved":false,"context_lines":[{"line_number":497,"context_line":"            subnets\u003dsubnets,"},{"line_number":498,"context_line":"            name\u003dport.get(\u0027name\u0027, df_const.DF_PORT_DEFAULT_NAME),"},{"line_number":499,"context_line":"            enabled\u003dport.get(\u0027admin_state_up\u0027, False),"},{"line_number":500,"context_line":"            chassis\u003dchassis, tunnel_key\u003dtunnel_key,"},{"line_number":501,"context_line":"            version\u003dport[\u0027db_version\u0027],"},{"line_number":502,"context_line":"            device_owner\u003dport.get(\u0027device_owner\u0027, None),"},{"line_number":503,"context_line":"            device_id\u003dport.get(\u0027device_id\u0027, None),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_09e68814","line":500,"range":{"start_line":500,"start_character":12,"end_line":500,"end_character":27},"updated":"2016-09-08 03:04:44.000000000","message":"in the above added code, you both set chassis \u003d remote_vtep and pass them to nb_api? are they both necessary?","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"7f24241ff6655750217b852f49773052c4a2773c","unresolved":false,"context_lines":[{"line_number":497,"context_line":"            subnets\u003dsubnets,"},{"line_number":498,"context_line":"            name\u003dport.get(\u0027name\u0027, df_const.DF_PORT_DEFAULT_NAME),"},{"line_number":499,"context_line":"            enabled\u003dport.get(\u0027admin_state_up\u0027, False),"},{"line_number":500,"context_line":"            chassis\u003dchassis, tunnel_key\u003dtunnel_key,"},{"line_number":501,"context_line":"            version\u003dport[\u0027db_version\u0027],"},{"line_number":502,"context_line":"            device_owner\u003dport.get(\u0027device_owner\u0027, None),"},{"line_number":503,"context_line":"            device_id\u003dport.get(\u0027device_id\u0027, None),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_abddbd15","line":500,"range":{"start_line":500,"start_character":12,"end_line":500,"end_character":27},"in_reply_to":"9a89bdaa_09e68814","updated":"2016-09-13 03:33:33.000000000","message":"the chassis value is similar with other lports, the remote_vtep field is used to indicate it\u0027s a remote port, if remote_vtep is not None, the port is remote port, you can also use the bool type field to replace it:)","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"974377ef4a865f1631a6ee52a5a162495b8962ea","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        if binding_profile and binding_profile.get("},{"line_number":564,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":565,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":566,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":567,"context_line":"            remote_vtep \u003d chassis"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"        updated_security_groups \u003d updated_port.get(\u0027security_groups\u0027)"},{"line_number":570,"context_line":"        if updated_security_groups:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_89c0d851","line":567,"range":{"start_line":566,"start_character":12,"end_line":567,"end_character":33},"updated":"2016-09-08 03:04:44.000000000","message":"ditto.","commit_id":"6b1b887fcdb49ad52918edaca38129c01fd69342"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b4ab4c961e134cc7994fe77a8ef0724f98ee1b20","unresolved":false,"context_lines":[{"line_number":515,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":516,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":517,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":518,"context_line":"            remote_vtep \u003d chassis"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        self.nb_api.create_lport("},{"line_number":521,"context_line":"            id\u003dport[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_dcd757bd","line":518,"range":{"start_line":518,"start_character":12,"end_line":518,"end_character":23},"updated":"2016-09-24 01:30:08.000000000","message":"remote_vtep got chassis value, both chassis and remote_vtep are passed to api_nb, it\u0027s confusing.\nAll call of remote_vtep() just check if remote_vtep is true or false, so why not use bool type.","commit_id":"5ac47e26367b0b56c9e0e34c4fb405c3ff5a1429"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"3f38053aee1568e0dfd2f976a29419c9ccc8c8af","unresolved":false,"context_lines":[{"line_number":515,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":516,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":517,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":518,"context_line":"            remote_vtep \u003d chassis"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        self.nb_api.create_lport("},{"line_number":521,"context_line":"            id\u003dport[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_50e16bcf","line":518,"range":{"start_line":518,"start_character":12,"end_line":518,"end_character":23},"in_reply_to":"5a8bc5a2_dcd757bd","updated":"2016-09-24 01:45:28.000000000","message":"All right, bool is more clear.","commit_id":"5ac47e26367b0b56c9e0e34c4fb405c3ff5a1429"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b4ab4c961e134cc7994fe77a8ef0724f98ee1b20","unresolved":false,"context_lines":[{"line_number":592,"context_line":"                df_const.DF_BINDING_PROFILE_PORT_KEY) \u003d\u003d\\"},{"line_number":593,"context_line":"                df_const.DF_REMOTE_PORT_TYPE:"},{"line_number":594,"context_line":"            chassis \u003d binding_profile.get(df_const.DF_BINDING_PROFILE_HOST_IP)"},{"line_number":595,"context_line":"            remote_vtep \u003d chassis"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        updated_security_groups \u003d updated_port.get(\u0027security_groups\u0027)"},{"line_number":598,"context_line":"        if updated_security_groups:"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_fcfdf33a","line":595,"range":{"start_line":595,"start_character":12,"end_line":595,"end_character":23},"updated":"2016-09-24 01:30:08.000000000","message":"ditto","commit_id":"5ac47e26367b0b56c9e0e34c4fb405c3ff5a1429"},{"author":{"_account_id":22060,"name":"jingting","email":"kangjingting@huawei.com","username":"jingting"},"change_message_id":"c078f5829d25c2c5bd845cdcb283dee4c6f7d727","unresolved":false,"context_lines":[{"line_number":620,"context_line":"                                                   []),"},{"line_number":621,"context_line":"            binding_profile\u003dupdated_port.get(portbindings.PROFILE, None),"},{"line_number":622,"context_line":"            binding_vnic_type\u003dupdated_port.get(portbindings.VNIC_TYPE, None),"},{"line_number":623,"context_line":"            version\u003dupdated_port[\u0027db_version\u0027], remote_vtep\u003dremote_vtep)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        LOG.info(_LI(\"DFMechDriver: update port %s\"), updated_port[\u0027id\u0027])"},{"line_number":626,"context_line":"        return updated_port"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_cf569b5b","line":623,"updated":"2016-09-26 07:56:39.000000000","message":"you should better start on a new line","commit_id":"e2bdb1aa6b08d7ea4d739b2d4fa3d49d5ec4e2fe"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"40a012696dd1087d1363638e3853b8369553eec2","unresolved":false,"context_lines":[{"line_number":620,"context_line":"                                                   []),"},{"line_number":621,"context_line":"            binding_profile\u003dupdated_port.get(portbindings.PROFILE, None),"},{"line_number":622,"context_line":"            binding_vnic_type\u003dupdated_port.get(portbindings.VNIC_TYPE, None),"},{"line_number":623,"context_line":"            version\u003dupdated_port[\u0027db_version\u0027], remote_vtep\u003dremote_vtep)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        LOG.info(_LI(\"DFMechDriver: update port %s\"), updated_port[\u0027id\u0027])"},{"line_number":626,"context_line":"        return updated_port"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_a5e946b9","line":623,"in_reply_to":"5a8bc5a2_cf569b5b","updated":"2016-09-26 18:44:09.000000000","message":"+1","commit_id":"e2bdb1aa6b08d7ea4d739b2d4fa3d49d5ec4e2fe"}],"dragonflow/tests/fullstack/test_remote_port.py":[{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"f47f5eaf76227769cc2a2a1585730ed1f2112a7a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        )\r"},{"line_number":85,"context_line":"\r"},{"line_number":86,"context_line":"        vm.server.stop()\r"},{"line_number":87,"context_line":"        vm.close()\r"},{"line_number":88,"context_line":"\r"},{"line_number":89,"context_line":"    def _get_wanted_tunnel_port(self, ovsdb, chassis_id):\r"},{"line_number":90,"context_line":"        if ovsdb.get_tunnel_ofport(chassis_id):\r"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a9d85d2_9e75e599","line":87,"updated":"2016-06-21 15:34:16.000000000","message":"Also need to close the network, right?","commit_id":"c14f06ca77e91c7845e483ea9b0fd978f40485bc"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"dec4e71ba2b84aeb30c31e16b5995b7ffbc11da2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"\r"},{"line_number":21,"context_line":"class TestRemotePort(test_base.DFTestBase):\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"    def setUp(self):\r"},{"line_number":24,"context_line":"        super(TestRemotePort, self).setUp()\r"},{"line_number":25,"context_line":"\r"},{"line_number":26,"context_line":"    def tearDown(self):\r"},{"line_number":27,"context_line":"        super(TestRemotePort, self).tearDown()\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"    def test_remote_port(self):\r"},{"line_number":30,"context_line":"        network \u003d self.store(objects.NetworkTestObj(self.neutron, self.nb_api))\r"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_e1546f55","line":27,"range":{"start_line":23,"start_character":4,"end_line":27,"end_character":46},"updated":"2016-07-19 02:03:31.000000000","message":"it seems these codes are redundant.","commit_id":"142b4897dcedd2d916186434b8ffda464b472555"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"6a90634f2da320f39cd4484361367960e04fa1b3","unresolved":false,"context_lines":[{"line_number":20,"context_line":"\r"},{"line_number":21,"context_line":"class TestRemotePort(test_base.DFTestBase):\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"    def setUp(self):\r"},{"line_number":24,"context_line":"        super(TestRemotePort, self).setUp()\r"},{"line_number":25,"context_line":"\r"},{"line_number":26,"context_line":"    def tearDown(self):\r"},{"line_number":27,"context_line":"        super(TestRemotePort, self).tearDown()\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"    def test_remote_port(self):\r"},{"line_number":30,"context_line":"        network \u003d self.store(objects.NetworkTestObj(self.neutron, self.nb_api))\r"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_51ab8cd6","line":27,"range":{"start_line":23,"start_character":4,"end_line":27,"end_character":46},"in_reply_to":"dada55a8_e1546f55","updated":"2016-07-19 02:21:18.000000000","message":"ok","commit_id":"142b4897dcedd2d916186434b8ffda464b472555"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"dec4e71ba2b84aeb30c31e16b5995b7ffbc11da2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                \u0027name\u0027: \u0027port1\u0027,\r"},{"line_number":51,"context_line":"                \u0027network_id\u0027: network_id,\r"},{"line_number":52,"context_line":"                \u0027binding:profile\u0027: {\r"},{"line_number":53,"context_line":"                    \u0027port_key\u0027: \u0027remote_port\u0027,\r"},{"line_number":54,"context_line":"                    \u0027host_ip\u0027: \u002710.10.10.10\u0027\r"},{"line_number":55,"context_line":"                }\r"},{"line_number":56,"context_line":"        }\r"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_e1dbcfeb","line":53,"range":{"start_line":53,"start_character":20,"end_line":53,"end_character":46},"updated":"2016-07-19 02:03:31.000000000","message":"Why not define {\u0027is_remote\u0027: True}?\nIs it more intuitive?","commit_id":"142b4897dcedd2d916186434b8ffda464b472555"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"1e9eff9514f63738c77c5f57c21cb75d41736f32","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                \u0027name\u0027: \u0027port1\u0027,\r"},{"line_number":51,"context_line":"                \u0027network_id\u0027: network_id,\r"},{"line_number":52,"context_line":"                \u0027binding:profile\u0027: {\r"},{"line_number":53,"context_line":"                    \u0027port_key\u0027: \u0027remote_port\u0027,\r"},{"line_number":54,"context_line":"                    \u0027host_ip\u0027: \u002710.10.10.10\u0027\r"},{"line_number":55,"context_line":"                }\r"},{"line_number":56,"context_line":"        }\r"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_6b9fb550","line":53,"range":{"start_line":53,"start_character":20,"end_line":53,"end_character":46},"in_reply_to":"dada55a8_516eec96","updated":"2016-07-19 06:53:15.000000000","message":"That\u0027s reasonable.","commit_id":"142b4897dcedd2d916186434b8ffda464b472555"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"6a90634f2da320f39cd4484361367960e04fa1b3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                \u0027name\u0027: \u0027port1\u0027,\r"},{"line_number":51,"context_line":"                \u0027network_id\u0027: network_id,\r"},{"line_number":52,"context_line":"                \u0027binding:profile\u0027: {\r"},{"line_number":53,"context_line":"                    \u0027port_key\u0027: \u0027remote_port\u0027,\r"},{"line_number":54,"context_line":"                    \u0027host_ip\u0027: \u002710.10.10.10\u0027\r"},{"line_number":55,"context_line":"                }\r"},{"line_number":56,"context_line":"        }\r"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_516eec96","line":53,"range":{"start_line":53,"start_character":20,"end_line":53,"end_character":46},"in_reply_to":"dada55a8_e1dbcfeb","updated":"2016-07-19 02:21:18.000000000","message":"In this scenario, only remote port will use binding:profile field, if you provide \u0027is_remote\u0027 key, it must be True, and we do not need to set False here to indicate it\u0027s a local port, what\u0027s more, the \u0027port_key\u0027 field can support many value options besides \u0027remote_port\u0027:)","commit_id":"142b4897dcedd2d916186434b8ffda464b472555"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"dec4e71ba2b84aeb30c31e16b5995b7ffbc11da2","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))\r"},{"line_number":61,"context_line":"        vm.create(network\u003dnetwork)\r"},{"line_number":62,"context_line":"\r"},{"line_number":63,"context_line":"        addresses \u003d vm.server.addresses[\u0027network1\u0027]\r"},{"line_number":64,"context_line":"        self.assertIsNotNone(addresses)\r"},{"line_number":65,"context_line":"        ip \u003d addresses[0][\u0027addr\u0027]\r"},{"line_number":66,"context_line":"        self.assertIsNotNone(ip)\r"},{"line_number":67,"context_line":"        mac \u003d addresses[0][\u0027OS-EXT-IPS-MAC:mac_addr\u0027]\r"},{"line_number":68,"context_line":"        self.assertIsNotNone(mac)\r"},{"line_number":69,"context_line":"\r"},{"line_number":70,"context_line":"        ovsdb \u003d utils.OvsDBParser()\r"},{"line_number":71,"context_line":"        wait_until_true(\r"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_e1890fcc","line":68,"range":{"start_line":63,"start_character":8,"end_line":68,"end_character":33},"updated":"2016-07-19 02:03:31.000000000","message":"There are several useful methods in VMTestObj class.","commit_id":"142b4897dcedd2d916186434b8ffda464b472555"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"6a90634f2da320f39cd4484361367960e04fa1b3","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))\r"},{"line_number":61,"context_line":"        vm.create(network\u003dnetwork)\r"},{"line_number":62,"context_line":"\r"},{"line_number":63,"context_line":"        addresses \u003d vm.server.addresses[\u0027network1\u0027]\r"},{"line_number":64,"context_line":"        self.assertIsNotNone(addresses)\r"},{"line_number":65,"context_line":"        ip \u003d addresses[0][\u0027addr\u0027]\r"},{"line_number":66,"context_line":"        self.assertIsNotNone(ip)\r"},{"line_number":67,"context_line":"        mac \u003d addresses[0][\u0027OS-EXT-IPS-MAC:mac_addr\u0027]\r"},{"line_number":68,"context_line":"        self.assertIsNotNone(mac)\r"},{"line_number":69,"context_line":"\r"},{"line_number":70,"context_line":"        ovsdb \u003d utils.OvsDBParser()\r"},{"line_number":71,"context_line":"        wait_until_true(\r"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_71fa10bf","line":68,"range":{"start_line":63,"start_character":8,"end_line":68,"end_character":33},"in_reply_to":"dada55a8_e1890fcc","updated":"2016-07-19 02:21:18.000000000","message":"ok, I\u0027ll use them, thx","commit_id":"142b4897dcedd2d916186434b8ffda464b472555"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"144ca1384621c6bf82469d57a58f7d175d33164e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        port.create(port\u003dport_body)\r"},{"line_number":52,"context_line":"        self.assertTrue(port.exists())\r"},{"line_number":53,"context_line":"\r"},{"line_number":54,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))\r"},{"line_number":55,"context_line":"        vm.create(network\u003dnetwork)\r"},{"line_number":56,"context_line":"\r"},{"line_number":57,"context_line":"        self.assertTrue(vm._wait_for_server_ready(30))\r"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_9f4cde43","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":10},"updated":"2016-07-19 09:38:14.000000000","message":"You just need to create a port, it will create the tap device also.","commit_id":"9bf99a355dafc1194153cc4aa8e32aa08d891e5f"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"f9521e0f3832ff543ea64247109d12e9b5eab3d8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"\r"},{"line_number":63,"context_line":"        ovsdb \u003d utils.OvsDBParser()\r"},{"line_number":64,"context_line":"        wait_until_true(\r"},{"line_number":65,"context_line":"            lambda: self._get_wanted_tunnel_port(ovsdb, \u002710.10.10.10\u0027),\r"},{"line_number":66,"context_line":"            timeout\u003d30, sleep\u003d2,\r"},{"line_number":67,"context_line":"            exception\u003dException(\u0027Could not get wanted tunnel port\u0027)\r"},{"line_number":68,"context_line":"        )\r"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_d38f45ca","line":65,"range":{"start_line":65,"start_character":25,"end_line":65,"end_character":48},"updated":"2016-07-20 02:41:23.000000000","message":"_get_wanted_tunnel_port will call get_tunnel_ofport, while get_tunnel_ofport add \u0027df-\u0027 to chassis_id to generate port name, it\u0027s wrong, \u0027df-\u0027 is redundant, it will call test failure","commit_id":"9bf99a355dafc1194153cc4aa8e32aa08d891e5f"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"dbf1651927e98a8a27cb3a3b85ffc089e58b9dce","unresolved":false,"context_lines":[{"line_number":62,"context_line":"\r"},{"line_number":63,"context_line":"        ovsdb \u003d utils.OvsDBParser()\r"},{"line_number":64,"context_line":"        wait_until_true(\r"},{"line_number":65,"context_line":"            lambda: self._get_wanted_tunnel_port(ovsdb, \u002710.10.10.10\u0027),\r"},{"line_number":66,"context_line":"            timeout\u003d30, sleep\u003d2,\r"},{"line_number":67,"context_line":"            exception\u003dException(\u0027Could not get wanted tunnel port\u0027)\r"},{"line_number":68,"context_line":"        )\r"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_cea67852","line":65,"range":{"start_line":65,"start_character":25,"end_line":65,"end_character":48},"in_reply_to":"dada55a8_d38f45ca","updated":"2016-07-20 03:39:16.000000000","message":"oh, I forget to modify the get_tunnel_ofport method, thx:)","commit_id":"9bf99a355dafc1194153cc4aa8e32aa08d891e5f"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"45f663a60072b8a23e7b89b43e96cd1e93ef7e0c","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        ovsdb \u003d utils.OvsDBParser()"},{"line_number":64,"context_line":"        wait_until_true("},{"line_number":65,"context_line":"            lambda: self._get_wanted_tunnel_port(ovsdb, \u002710.10.10.10\u0027),"},{"line_number":66,"context_line":"            timeout\u003d30, sleep\u003d2,"},{"line_number":67,"context_line":"            exception\u003dException(\u0027Could not get wanted tunnel port\u0027)"},{"line_number":68,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_b5848fb1","line":65,"range":{"start_line":65,"start_character":25,"end_line":65,"end_character":48},"updated":"2016-08-31 23:29:38.000000000","message":"get_tunnel_ofport is ok here","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"}],"dragonflow/tests/unit/test_mech_driver.py":[{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"45f663a60072b8a23e7b89b43e96cd1e93ef7e0c","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            macs\u003d[\u0027aabb\u0027], ips\u003d[\u002710.0.0.1\u0027],"},{"line_number":183,"context_line":"            name\u003d\u0027FakePort\u0027, subnets\u003d[\u0027sub-1\u0027],"},{"line_number":184,"context_line":"            enabled\u003dTrue, chassis\u003dNone, tunnel_key\u003dtunnel_key,"},{"line_number":185,"context_line":"            device_owner\u003d\u0027compute\u0027, device_id\u003d\u0027d1\u0027, remote_vtep\u003dNone,"},{"line_number":186,"context_line":"            port_security_enabled\u003dFalse, security_groups\u003d[],"},{"line_number":187,"context_line":"            binding_profile\u003dNone, binding_vnic_type\u003d\u0027ovs\u0027,"},{"line_number":188,"context_line":"            allowed_address_pairs\u003d[], version\u003dself.dbversion)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_f5537737","line":185,"range":{"start_line":185,"start_character":64,"end_line":185,"end_character":68},"updated":"2016-08-31 23:29:38.000000000","message":"could you add a valid value to remote_vtep?","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"692fd4dcb1cbf6fdcd22fb23657a92004aae295b","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            macs\u003d[\u0027aabb\u0027], ips\u003d[\u002710.0.0.1\u0027],"},{"line_number":183,"context_line":"            name\u003d\u0027FakePort\u0027, subnets\u003d[\u0027sub-1\u0027],"},{"line_number":184,"context_line":"            enabled\u003dTrue, chassis\u003dNone, tunnel_key\u003dtunnel_key,"},{"line_number":185,"context_line":"            device_owner\u003d\u0027compute\u0027, device_id\u003d\u0027d1\u0027, remote_vtep\u003dNone,"},{"line_number":186,"context_line":"            port_security_enabled\u003dFalse, security_groups\u003d[],"},{"line_number":187,"context_line":"            binding_profile\u003dNone, binding_vnic_type\u003d\u0027ovs\u0027,"},{"line_number":188,"context_line":"            allowed_address_pairs\u003d[], version\u003dself.dbversion)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_fe1a4f16","line":185,"range":{"start_line":185,"start_character":64,"end_line":185,"end_character":68},"in_reply_to":"fa7ab95a_f5537737","updated":"2016-09-01 14:05:33.000000000","message":"ok","commit_id":"23a76ae3612afac98e5d88bec68c7e86c9711708"}]}
